守护进程化的两次fork

1、第一次fork,使子进程形式上脱离控制终端,不必在挂在终端输入上。并为后续的setsid服务。

2、setsid使进程变为会话组长(同时也是进程组长),实际脱离原来的控制终端,不会再收到终端的一些信号。

    a)进程组是一个或多个进程的集合。进程id等于进程组id的进程是组长进程。进程组中只要有一个进程存在,该进程组就存在,与组长进程是否终止无关。

    b)会话开始于用户登录,终止于用户退出。setsid用于创建新会话,但如果调用进程为组长进程,则返回-1。若调用进程不是组长进程,则将该进程变为新的会话首进程,也成为新进程组的组长。

3、第二次fork实际上不是必需的,主要是为了防止进程再次打开一个控制终端。再fork一次,子进程不是会话组长(进程id不等于sid),不能打开新的终端。

转载于:https://my.oschina.net/u/136074/blog/726516

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题需要一些代码实现。以下是一个简单的示例,可以创建一个守护进程,然后使用fork创建子进程,再使用kill向子进程发送信号,让父进程可以感知到子进程退出事件: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/wait.h> void child_handler(int sig) { printf("Child process exited.\n"); } int main() { // 创建守护进程 pid_t pid = fork(); if (pid < 0) { perror("Failed to fork."); exit(EXIT_FAILURE); } if (pid > 0) { // 父进程退出 exit(EXIT_SUCCESS); } if (setsid() < 0) { perror("Failed to create new session."); exit(EXIT_FAILURE); } if (chdir("/") < 0) { perror("Failed to change working directory."); exit(EXIT_FAILURE); } umask(0); // 创建子进程 pid_t child_pid = fork(); if (child_pid < 0) { perror("Failed to fork."); exit(EXIT_FAILURE); } if (child_pid == 0) { // 子进程 sleep(10); exit(EXIT_SUCCESS); } // 父进程 signal(SIGCHLD, child_handler); kill(child_pid, SIGKILL); waitpid(child_pid, NULL, 0); printf("Parent process exited.\n"); return 0; } ``` 在代码中,首先创建守护进程,然后使用fork创建子进程,在子进程中使用sleep模拟一些操作,最后退出。在父进程中,我们使用signal函数设置一个信号处理函数,用于感知子进程退出事件。 接着,我们使用kill向子进程发送SIGKILL信号,使其退出。然后,使用waitpid函数等待子进程退出,并在子进程退出后输出一条消息,表示父进程也已退出。 注意,在守护进程中,我们需要使用setsid创建新的会话,并使用chdir和umask等函数设置工作目录和文件模式掩码。这些操作可以使守护进程摆脱控制终端和文件系统的限制,更好地运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值