Linux下守护进程的实现

来源:互联网 发布:全面战争多核优化 编辑:程序博客网 时间:2024/06/06 01:15

一.fork()函数
通过系统调用创建一个与原进程几乎一模一样的进程,可理解为克隆了一个自己。fork函数的返回值有下面几种情况:

 1. 在父进程中返回新创建子进程的的进程ID 2. 在子进程中返回0 3. 调用失败,返回负值

二.进程相关知识

这里写图片描述
1.进程组
一个或者多个进程的集合。每个进程组拥有一个进程组ID,同时有一个进程组长,且( 进程组长ID == 进程组ID )。
2.会话
一个或者多个进程组的集合。每个会话拥有一个领头进程。
3.控制终端
一个会话的所有进程组共享一个控制终端,fork产生的子进程继承父进程的进程组、会话、控制终端。会话的领头进程可以重新打开一个控制终端。
三.setsid()函数
建立新会话:setsid()
若调用进程是组长进程,则出错返回。一般用法如下:

if(fork())      exit(0); // 父进程退出setsid(); // 创建新会话,同时子进程变为组长进程

若调用进程不是组长进程,则创建一个新会话:
1. 该进程变成新会话领头进程
2. 该进程成为一个新进程组的组长进程
3. 该进程没有控制终端,如果之前有,则中断
由二(3)可知,会话的领头进程可重新打开一个控制终端。为了防止情况发生,可如下使用:

if(fork())    exit(0);  // 父进程退出setsid();     // 以子进程为领头进程建立会话if(fork())    // 子进程调用fork,产生二代子进程    exit(0);  // 二代子进程不再是新建会话的领头进程(不能打开控制终端)
0 0