创建守护进程步骤
笔记目录:
1.了解基本概念
2.守护进程创建的注意事项
3.写出守护进程的代码
1.了解基本概念
首先我们要了解一些基本概念:
进程组 :
·每个进程也属于一个进程组
·每个进程主都有一个进程组号,该号等于该进程组组长的PID号 .
·一个进程只能为它自己或子进程设置进程组ID号
会话期:
会话期(session)是一个或多个进程组的集合。
setsid()函数可以建立一个对话期:
扫描二维码关注公众号,回复:
1000837 查看本文章
如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。
(1)此进程变成该对话期的首进程
(2)此进程变成一个新进程组的组长进程。
(3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除。 如果该进程是一个进程组的组长,此函数返回错误。
(4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行
2.守护进程创建的注意事项
守护进程的第一步也是最重要的一步是是否以最高管理员的权限的进行创建/(ㄒoㄒ)/~~ 实验课上搞半天,才发现管理员的身份不是最高权限
现在我们来给出创建守护进程所需步骤:
编写守护进程的一般步骤步骤:
(1)在父进程中执行fork并exit推出;
(2)在子进程中调用setsid函数创建新的会话;
(3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;
(4)在子进程中调用umask函数,设置进程的umask为0;
(5)在子进程中关闭任何不需要的文件描述符
3.写出守护进程的代码
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <fcntl.h> #include <string.h> #include <sys/stat.h> #define ERR_EXIT(m) \ do\ {\ perror(m);\ exit(EXIT_FAILURE);\ }\ while (0);\ void creat_daemon(void); int main(void) { time_t t; int fd; creat_daemon(); while(1){ fd = open("daemon.log",O_WRONLY|O_CREAT|O_APPEND,0644); if(fd == -1) ERR_EXIT("open error"); t = time(0); char *buf = asctime(localtime(&t)); write(fd,buf,strlen(buf)); close(fd); sleep(60); } return 0; } void creat_daemon(void) { pid_t pid; pid = fork(); if( pid == -1) ERR_EXIT("fork error"); if(pid > 0 ) exit(EXIT_SUCCESS); if(setsid() == -1) ERR_EXIT("SETSID ERROR"); chdir("/"); int i; for( i = 0; i < 3; ++i) { close(i); open("/dev/null", O_RDWR); dup(0); dup(0); } umask(0); return;
参看博客:
https://blog.csdn.net/one_piece_hmh/article/details/52770111