第三章第三节 进程间关系
进程组
Linux下每个进程都隶属于一个进程组,其进程组ID——PGID;使用getpgid函数可获取指定进程的PGID。
1 | /* |
每个进程组都有一个首领进程,其PGID与PID相同;进程组将一直存在,直到其中所有进程均退出,或加入其他进程组。
使用setpgid可设置PGID。
1 | /* |
- 若pid=pgid。进程pid为进程组pgid的首领;
- 若pid=0。设置当前进程的PGID为pgid;
- 若pgid=0。设置pid为进程pid的PGID;
一个进程只能设置自己或其子进程的PGID;而当子进程调用exec系列函数后,我们也不能再在父进程中对它设置PGID。
会话
一些有关联的进程组将形成一个会话session。下面的函数用于创建一个会话。
1 | /* |
进程组的首领进程不能调用setsid,否则会产生一个错误。对于非组首领的进程,调用该函数不仅创建新会话,而且有如下额外效果。
- 调用进程成为会话的首领,此时该进程是新会话的唯一成员;
- 新建一个进程组,其PGID就是调用进程的PID,调用进程成为这个进程组的首领;
- 调用进程将甩开终端;
一个会话的会话ID被认为是会话首领所在进程组的PGID。使用getsid函数得到会话ID。
1 | /* |