1、会话
一个会话可以包含1个或多个进程组,shell管道通常会将几个进程编成一组
比如:pro1 | proc2 && proc3|proc4|proc5|proc6
此时形成了两个进程组,p1,p2是一组,p3,p4,p5,p6又是一个进程组
2、setsid---建立会话
如果调用此函数的进程不是进程组的组长,则此函数创建一个新会话,如果已经是组长则创建出错。
如何保证创建会话的进程不是进程组的组长,通过fork创建子进程,然后关闭父进程,由于子进程继承父进程的进程组ID,所以它不是进程组长。
1)该进程会成为会话首进程,调用setsid的创建会话的进程为首进程,此时它是会话中唯一进程,(也将成为会话的控制进程--自己推断)
2)该进程会成为新进程组的组长进程,新进程组ID即为该进程ID
3)该进程没有控制终端关联,即使有也会被切断
3、getsid(pid)
获取指定进程的会话id,如果pid不在调用进程所在的会话,将不会返回会话首进程的组ID。
系统启动后,进入shell后,shell执行程序会在子进程中设置进程组ID--setpgid,让子进程在新的进程组中担任组长进程