【Linux】:Linux间进程关系

Linux间进程关系

  • 一.一个例子
  • 二.会话和进程组

一.一个例子

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

关系:

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

  2. PGID:进程组ID

  3. SID:session id

  4. TTY:表示当前终端。

二.会话和进程组

PGID

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

现在矫正之前的说法,前面说Linux里只有一个前台进程,其实是不准确的。因为前台有可能是一个进程组,所以我们更愿意称它们为前台任务和后台任务。

SID

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

【Linux】:Linux间进程关系_第1张图片

用户登陆时创建session,退出时销毁session。所以我们的操作系统里可能会同时存在多个session。操作系统内部也会存在管理session的结构体,包括创建时间,销毁时间,前台进程,后台进程…由于session很多,所以就会有SID来区分session 。

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

守护进程

那么就会出现一个问题,如果我们退出了当前登陆,那么该session里的进程会被销毁(不排除有些系统不会销毁),为了保证即使我们退出登陆进程也不会销毁,我们可以将让进程单独形成一个会话,这样的操作就被称为守护进程。

在这里插入图片描述

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

手写

【Linux】:Linux间进程关系_第2张图片

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

调用接口

【Linux】:Linux间进程关系_第3张图片

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

你可能感兴趣的:(Linux系统,linux,服务器,c++)