文章目录
  1. 进程组
  2. 会话

进程组

Linux下每个进程都隶属于一个进程组,其进程组ID——PGID;使用getpgid函数可获取指定进程的PGID。

1
2
3
4
5
/*
引用方式: #include <unistd.h>
返回进程pid所属进程组的PGID: 成功 || 返回-1并设置errno: 失败
*/
pid_t getpgid(pid_t pid);

每个进程组都有一个首领进程,其PGID与PID相同;进程组将一直存在,直到其中所有进程均退出,或加入其他进程组。

使用setpgid可设置PGID。

1
2
3
4
5
/*
引用方式: #include <unistd.h>
返回0: 成功 || 返回-1并设置errno: 失败
*/
int setpgid(pid_t pid, pid_t pgid);
  • 若pid=pgid。进程pid为进程组pgid的首领;
  • 若pid=0。设置当前进程的PGID为pgid;
  • 若pgid=0。设置pid为进程pid的PGID;

一个进程只能设置自己或其子进程的PGID;而当子进程调用exec系列函数后,我们也不能再在父进程中对它设置PGID。

会话

一些有关联的进程组将形成一个会话session。下面的函数用于创建一个会话。

1
2
3
4
5
/*
引用方式: #include <unistd.h>
返回新的进程组的PGID: 成功 || 返回-1并设置errno: 失败
*/
pid_t setsid(void);

进程组的首领进程不能调用setsid,否则会产生一个错误。对于非组首领的进程,调用该函数不仅创建新会话,而且有如下额外效果。

  • 调用进程成为会话的首领,此时该进程是新会话的唯一成员;
  • 新建一个进程组,其PGID就是调用进程的PID,调用进程成为这个进程组的首领;
  • 调用进程将甩开终端;

一个会话的会话ID被认为是会话首领所在进程组的PGID。使用getsid函数得到会话ID。

1
2
3
4
/*
引用方式: #include <unistd.h>
*/
pid_t getsid(pid_t pid);