0%

setsid

1. 介绍

1
2
#include <unistd.h>
pid_t setsid(void);

创建新的会话,并设进程组ID为新的会话ID

2. linux中各种进程组控制

单个进程使用进程pid控制;

如果想同时控制多个进程,需要进程组,进程组中的进程都是由一个进程fork()出来的;

进程组可以分前台进程组和后台进程组:

  • 前台进程组: 可以直接接收终端控制信号的进程组,正在前台运行的,比如按 ctrl+c,可以直接给正在运行的进程组发中断信号
  • 后台进程组:不能直接接收终端控制,比如按 ctrl+c,不能传递给后台进程

谁负责判断哪个是前台进程组,哪个是后台进程组?进而给前台进程组一个控制终端呢?是会话组来管理的;

一个会话组包含1个前台进程组和多个后台进程组,一个会话组有1个会话id。只有会话组的领头进程能获取控制终端,进而控制哪个进程组可以受控制终端控制;

一般打开一个shell,就新建一个会话组,有一个控制终端;关闭这个shell,会给当前会话组中的所有进程(包括前台和后台)发送一些中断信号,告诉进程这个会话组要退出了,你们看着办。

设置daemon程序时,主要目的是为了让程序不受当前控制终端信号影响。因此先fork()一次,调用setsid() 开个新的会话组,这样就不受启动这个程序的shell的信号影响了。有的会再fork()一次,是因为只有会话的领导进程能获取控制终端,再fork()出来的进程是领导的子进程,一定不会获取控制终端。其实不fork()第二次也可以,nginx都没这样。

至于具体有哪些输入输出和tty那些,之后再看吧。