linux进程/进程组的一些概念,和相关API,setpgid等

  • Post author:
  • Post category:linux



1、 int setpgid(pid_t pid, pid_t pgid);

功能1:设置进程pid所在的进程组的ID为pgid,如果pid的实参为0,setpgid(0, 5)等价于setpgid(getpid(), 5),其中getpid()的作用是获取本进程的pid。

功能2:把进程pid移动到别的进程组(这一功能的一个常见例子就是:shell创建管道线时),原进程组和目标进程组必须处于同一个会话(session)中(相关内容可参考setsid、credentials函数),这时pgid接受的实参应该为一个已经存在的目标进程组的pgid。

返回值:成功返回0,失败返回-1并设置errno。


2、pid_t getpgid(pid_t pid);


获取进程pid所在的进程组的pgid,如果pid实参为0,则返回本进程所在的进程组的pgid。

返回值:成功返回pgid,失败返回-1并设置errno。

其他:


·

通过fork创建的子进程会继承进程组pgid,execve也会继承;


·

每一个进程组都是某个会话的成员,每一个进程都是某个进程组的成员;


·

每个会话都有一个控制终端。任何时候,每个会话中,有且仅有一个进程组充当控制终端的前台进程组,其他进程组都在后台。如果控制终端产生了一个信号(例如按下键盘的ctrl+c产生终止信号),那么这个信号会被发送到前台进程组。只有前台进程组可以通过read函数读取控制终端的数据,如果后台进程组调用了read函数,那么后台进程组会收到一个SIGTTIN信号,该信号会阻塞进程。tcgetpgrp( ) and tcsetpgrp( )函数可以获取和设置某个控制终端的前台进程组。


·

如果某个会话有控制终端,且该终端没有设置CLOCAL标志,这时如果终端被挂起,会话的领导者会收到SIGHUP信号。如果会话的领导者早就退出了,那么这个信号仍然会被发送到该终端的前台进程组的每一个进程中。


·

如果某个进程退出后,导致某个进程组变成了孤立进程组,这时,该孤立进程组中的任何一个进程stop的话,那么该孤立进程组中的每一个进程都会收到两个连续信号:SIGCONT、SIGHUP。如果某个进程组满足以下特性,那么他就是一个孤立进程组:该进程组中的每一个进程的父进程是这两者之一:①它本身,或者同进程组中的其他进程,②不同会话中的进程组中的一个进程。