一.一个例子

在Linux里能够获取键盘输入的进程被称为前台进程,通常前台进程只有一个(当然说法并不准确,下文会有更准确的说法,暂时先这样理解),后台进程可以有多个,启动进程时+&就可以让该进程在后台启动。

后台启动一个proc进程,将它的输出重定向到log.txt文件里,再启动三个无意义的进程方便我们查看

【Linux】:Linux间进程关系-LMLPHP

在上面我们启动了两组后台任务。

【Linux】:Linux间进程关系-LMLPHP

使用ps指令查看更详细的信息

【Linux】:Linux间进程关系-LMLPHP

关系:

  1. PPID:父进程唯一标识符,PID:当前进程唯一标识符(不再多说)

  2. PGID:进程组ID

  3. SID:session id

  4. TTY:表示当前终端。

二.会话和进程组

仔细观察上面的例子,可以发现三个sleep进程是同一个进程组,而proc是单独一个进程组。同时proc的PGID=PID,sleep三个进程的PGIP=第一个sleep的PID,组长是多个进程中的第一个,它的ID被称为组ID。

在Linux里每一个用户在登陆时都会形成一个session(会话)。

【Linux】:Linux间进程关系-LMLPHP

我们可以发现它们的SID都是一样的,说明都是处于同一会话里。

【Linux】:Linux间进程关系-LMLPHP

这个函数很简单,该函数的返回值就是守护进程的PID。注意:该进程不能是进程组的组长,所以我们需要保证该进程不是组长,那么就要保证它不是第一个进程。一般的做法是fork后,让父进程直接退出,子进程变成守护进程。所以守护进程的本质是孤儿进程。

手写

【Linux】:Linux间进程关系-LMLPHP

当然,系统也有直接的接口来创建守护进程。

调用接口

【Linux】:Linux间进程关系-LMLPHP

  1. 第一个参数,如果设置为0就工作在根目录下,否则就工作在当前目录。
  2. 第二个参数,如果为0,就把标准输出,输入和错误重定向到/dev/null,否则就不改变。
02-02 04:12