一.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); // 二代子进程不再是新建会话的领头进程(不能打开控制终端)