- 守护进程:
- 即后台运行的进程,随着系统的启动而启动,随着系统的终止而终止;
- 创建守护进程的流程:
- 一、创建孤儿进程(fork函数):
- 孤儿进程:
- 子进程没执行结束,父进程就已经退出,此时子进程就变成孤儿进程,不过孤儿进程会被
init进程
回收; - 二、创建新的会话和新的进程组(setsid函数):
- setsid函数:
#include <sys/types.h>
#include <unistd.h>
pid_t setsid(void);
- 三、进程的工作目录切换到根目录(chdir函数):
- 可以不切换到根目录,只要保证此工作目录不被删除即可;
- chdir函数:
#include <unistd.h>
int chdir(const char *path);
- 四、设置所创建文件的掩码(umask函数):
- umask函数:
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
- 五、创建日志文件(open函数):
- 本示例代码采用的是当前的目录下创建日志文件;
int fd = open("./kkk.log",O_WRONLY|O_CREAT|O_TRUNC,0666);
- 六、进程的文件描述符(标准输入:0、标准输出:1、标准出错:2)重定向到文件中(dup2函数):
- dup2函数:
#include <unistd.h>
int dup2(int oldfd, int newfd);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
pid_t pid = 0;
int fd = 0;
char buf[] = "I Love China!!!\n";
if(-1 == (pid = fork()))
{
perror("fork error");
exit(EXIT_FAILURE);
}else if(0 < pid){
exit(EXIT_SUCCESS);
}else if(0 == pid){
if(-1 == setsid())
{
perror("setsid error");
exit(EXIT_FAILURE);
}
umask(0);
if(-1 == (fd = open("./kkk.log",O_WRONLY|O_CREAT|O_TRUNC,0666)))
{
perror("open error");
exit(EXIT_FAILURE);
}
dup2(fd,0);
dup2(fd,1);
dup2(fd,2);
write(fd,buf,sizeof(buf));
}
return 0;
}
linux@ubuntu:~$ gcc k1.c
linux@ubuntu:~$ ./a.out
linux@ubuntu:~$ cat kkk.log
I Love China!!!
linux@ubuntu:~$