宜兴市城乡建设局网站,静态网站什么样,网站推广的岗位要求,郑州电力高等专科学校电话2.31、守护进程#xff08;2#xff09;1.守护进程的创建步骤2.什么情况下子进程不会继承父进程的组ID3.哪些操作会导致子进程的组ID发生改变4.kill怎么杀掉守护进程的实现守护进程1.守护进程的创建步骤
执行一个 fork()#xff0c;之后父进程退出#xff0c;子进程继续执…
2.31、守护进程21.守护进程的创建步骤2.什么情况下子进程不会继承父进程的组ID3.哪些操作会导致子进程的组ID发生改变4.kill怎么杀掉守护进程的实现守护进程1.守护进程的创建步骤
执行一个 fork()之后父进程退出子进程继续执行。 使用子进程的目的是防止创建会话的进程为首进程创建守护进程daemon时通常需要让该进程摆脱与控制终端的关联即让它成为一个无终端进程。首进程创建会话会导致新建会话的组id与之前存在的组id相同。 子进程调用 setsid() 开启一个新会话。清除进程的 umask 以确保当守护进程创建文件和目录时拥有所需的权限。修改进程的当前工作目录通常会改为根目录/。关闭守护进程从其父进程继承而来的所有打开着的文件描述符。在关闭了文件描述符0、1、2之后守护进程通常会打开/dev/null 并使用dup2() 使所有这些描述符指向这个设备。核心业务逻辑
2.什么情况下子进程不会继承父进程的组ID
当父进程使用setpgid()系统调用将自己加入到一个新的进程组中而子进程在此之后被创建时子进程不会继承父进程的PGID而是创建一个新的进程组并将自己作为该进程组的领导进程PGID与PID相同。当父进程在创建子进程之前调用了setsid()系统调用创建了一个新的会话子进程也会在此之后创建一个新的会话并成为该会话的领导进程PGID与PID相同。当父进程使用CLONE_NEWPID或CLONE_NEWUSER等Linux特有的命名空间创建了一个新的进程隔离环境时子进程不会继承父进程的PGID。
3.哪些操作会导致子进程的组ID发生改变
调用setpgid()系统调用将子进程加入到一个新的进程组中子进程的PGID将被设置为指定的PGID。在子进程中调用setpgid()系统调用将自己加入到一个新的进程组中子进程的PGID将被设置为指定的PGID。在子进程中调用setsid()系统调用创建一个新的会话子进程将成为该会话的领导进程并且PGID与PID相同。在子进程中调用exec()系统调用执行另一个程序新程序的PGID可能与旧程序不同。
4.kill怎么杀掉守护进程的
在Linux系统中kill命令可以向指定进程发送信号。这个过程是通过进程IDPID来实现的而不是通过控制终端。即使守护进程没有控制终端它也有一个PID其他进程可以使用这个PID向它发送信号其中包括kill命令发送的信号。
实现守护进程
#include stdio.h
#include sys/types.h
#include unistd.h
#include sys/stat.h
#include sys/time.h
#include signal.h
#include time.h
#include fcntl.h
#include string.hvoid work()
{// 获取从1970到time_t tm time(NULL);struct tm* loc localtime(tm);// char buf[1024];// sprintf(buf, %d-%d-%d %d:%d:%d\n, 1900 loc-tm_year, 1 loc-tm_mon// , loc-tm_mday, loc-tm_hour, loc-tm_min, loc-tm_sec);// printf(%s, buf);char* str asctime(loc);// printf(%s\n, str);int fd open(time.txt, O_CREAT | O_APPEND | O_RDWR, 0664);write(fd, str, strlen(str));}int main()
{// 创建子进程让父进程结束掉pid_t proPid fork();if (proPid 0){return 0;}// 创建新的会话窗口pid_t sePid setsid();// 使用umask// mode_t ~umaskumask(022);// 重定向进程工作目录但是我们用户没有根目录权限chdir(/home/nowcoder/);// 将标准输出重定向到/dev/null目录下int fd open(/dev/null);dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);sup2(fd, STDERR_FILENO);// 设置信号捕捉struct sigaction act;act.sa_flags 0;sigemptyset(act.sa_mask);act.sa_handler work;sigaction(SIGALRM, act, NULL);// 从3秒之后每隔两秒发送SIGALAR信号struct itimerval val;val.it_value.tv_sec 3;val.it_value.tv_usec 0;val.it_interval.tv_sec 2;val.it_interval.tv_usec 0; setitimer(ITIMER_REAL, val, NULL);while (1){sleep(2);}return 0;
}