进程组
进程组是一个或多个进程的集合,每个进程都属于一个进程组,进程组有唯一组ID。同一进程组中的各进程接收来自同一终端的各种信号。
<unistd.h> pid_t getpgrp(void);//返回调用进程的进程组ID
每个进程组有一个组长进程,进程组ID即为组长进程ID。进程组组长可以创建一个进程组、创建组中的进程,然后终止。只要进程组有一个进程,进程组就存在。
//加入另一个进程组或创建一个新进程组 <unistd.h> int setpgid(pid_t pid,pid_t pgid);//成功返回0,失败返回-1 //将pid进程的进程组设置为pgid //pid=0表示使用调用者的进程ID //pgid为0表示指定的进程ID作为进程组ID
一个进程只能设置自己和子进程的进程组ID。
会话
会话是一个或多个进程组的集合。一个会话开始于用户登录,终止于用户退出,在此期间,该用户运行的所有进程都属于这个会话周期。
//创建一个新的会话 <unistd.h> pid_t setsid(void);//成功返回进程组ID,失败返回-1 //该进程称为新会话的会话首进程(创建该会话的进程),会话ID即为首进程的ID //该进程成为一个新进程组的组长进程 //切断与控制终端的联系 //如果该进程已经是一个进程组的组长,则函数出错。
<unistd.h> pid_t getsid(pid_t pid)//返回调用者会话首进程的进程组ID,即首进程ID,失败返回-1 //pid一般为0,表示调用进程的ID
控制终端
如果一个会话有一个控制终端,则它有一个前台进程组,其它进程组为后台进程组。建立与控制终端连接的会话首进程被称为控制进程。控制终端的输入和终端产生的信号会发给前台进程组。