一.一个例子
在Linux里能够获取键盘输入的进程被称为前台进程,通常前台进程只有一个(当然说法并不准确,下文会有更准确的说法,暂时先这样理解),后台进程可以有多个,启动进程时+&就可以让该进程在后台启动。
后台启动一个proc进程,将它的输出重定向到log.txt文件里,再启动三个无意义的进程方便我们查看
在上面我们启动了两组后台任务。
使用ps指令查看更详细的信息
关系:
-
PPID:父进程唯一标识符,PID:当前进程唯一标识符(不再多说)
-
PGID:进程组ID
-
SID:session id
-
TTY:表示当前终端。
二.会话和进程组
仔细观察上面的例子,可以发现三个sleep进程是同一个进程组,而proc是单独一个进程组。同时proc的PGID=PID,sleep三个进程的PGIP=第一个sleep的PID,组长是多个进程中的第一个,它的ID被称为组ID。
在Linux里每一个用户在登陆时都会形成一个session(会话)。
我们可以发现它们的SID都是一样的,说明都是处于同一会话里。
这个函数很简单,该函数的返回值就是守护进程的PID。注意:该进程不能是进程组的组长,所以我们需要保证该进程不是组长,那么就要保证它不是第一个进程。一般的做法是fork后,让父进程直接退出,子进程变成守护进程。所以守护进程的本质是孤儿进程。
手写
当然,系统也有直接的接口来创建守护进程。
调用接口
- 第一个参数,如果设置为0就工作在根目录下,否则就工作在当前目录。
- 第二个参数,如果为0,就把标准输出,输入和错误重定向到/dev/null,否则就不改变。