UNIX中进程组ID和作业ID之间的区别

问题描述:

请告诉我进程组ID和作业ID之间的区别。 jobid是一个shell程序的内建,还是与内核有关?他们每个人的用途是什么?当一个进程在后台运行时,只有jobid集或者是pgid集? setpgid()函数的用途是什么?UNIX中进程组ID和作业ID之间的区别

当一个进程在后台运行时,内核是否也涉及到,或者shell是否负责后台或前台?

好问题。作业ID大多只是一个shell构造。内核中支持与作业控制有关的信号形式,以及内核准确知道将作业控制信号发送给哪些进程的方式。

严格来说,对您的第一个问题的答案是,作业ID纯粹是一个壳创作。它存在是因为管道(或者很少,另一个shell分组结构)可能由多个应该作为一个单元控制的进程组成。

要回答最后一个问题,shell首先执行fork(2),然后执行execve(2),然后启动所有进程。与&唯一的区别是shell不会执行wait(2)(或相关的变体),因此程序可以“在后台”继续。 Unix在前景和背景之间实际上几乎没有区别。

进程组是一个由shell定义的关联,以便内核知道处理一组各种“后台”进程的单个“前台”进程。这主要是重要的,以便后台进程在他们决定突然从终端读取时产生一个信号。 (这样的终端可能连接到标准输入。)这将导致“作业”生成一个信号,外壳将提示用户做一些事情。

尝试(sleep 5; read x)&并在6秒后键入一个返回或东西,以便壳唤醒。这就是当你看到像...

[1] +停止(睡眠5;读取X)

...然后你键入fg将其拉入前景。

最初,Unix有流水线,它有&,但没有办法在前台和后台之间移动命令或管道,也无法帮助突然决定读取标准输入的后台进程。

Bill Joy和其他人在早期版本的BSD和csh(1)中添加了作业控制和内核支持。这些都是由商业Unix线上线程获取的,并且被克隆用于工作类似的Linux内核。


关于关于进程组和ps(1) ...... 的问题,以支持外壳作业控制,内核进程状态包括进程组ID和会话ID。 A 进程组作业是相同的东西,但作业编号只是外壳组成的句柄。如果会话ID与pid相同,则进程是会话负责人;如果pgid与pid相同,则进程是进程组负责人。我相信ps(1)打印的+会发生更微妙的变化。每个终端都知道它的前台进程组是什么,所以我相信一个进程会得到一个+ if pid == pgid & &(pgid是控制终端的前台pg)。

总之,内核保留了几个状态项:pid,pgid,sid,一个进程可能有一个控制终端,而一个终端可能有一个前台pgid。这些证书主要用于支持作业控制,但也用于在用户注销时撤销对终端的访问。

+0

在进程组的例子中,进程组有什么用处。详细说明过程组是如何参与的。 – avd 2009-10-02 12:01:56

+0

还有一件事,你写了前台进程控制后台进程,你能给我一个这样的例子吗? – avd 2009-10-02 12:03:35

+0

对不起还有一个疑问,你写到工作id是建立在shell中的,所以前景/背景是对shell的理解,但是当我们做“ps”时,它会以“R”或“R +”的形式显示为前景和后台进程但是ps是由内核执行的,所以内核如何知道作业是回退/前台。 – avd 2009-10-02 12:10:12