请告诉我进程组ID和jobid之间的区别.jobid是内置的shell程序还是与内核相关?他们每个人的用途是什么?当进程在后台运行时,只设置jobid或者是否设置了pgid?setpgid()函数的用途是什么?
当一个进程在后台运行时,内核是否也参与其中,或者shell是否负责后台或前台?
Dig*_*oss 13
好问题.作业ID主要只是一个shell构造.内核中支持作业控制中涉及的信号形式,以及内核确切地知道将作业控制信号发送到哪些进程的方式.
严格来说,你的第一个问题的答案是,job id纯粹是一个shell创建.它的存在是因为管道(或很少是另一个shell分组构造)可能由多个应该由一个单元控制的进程组成.
为了回答你的上一个问题,shell首先执行a fork(2)然后执行a来启动所有进程execve(2).唯一的区别&是shell不执行wait(2)(或相关的变体),因此程序可以"在后台"继续.Unix在前景和背景之间几乎没有什么区别.
进程组是由shell定义的关联,以便内核知道处理一组各种"后台"进程的单个"前台"进程.这一点非常重要,因为如果他们决定突然从终端读取,后台进程将生成一个信号.(这样的终端可能连接到标准输入.)这将导致"作业"生成信号,shell将提示用户执行某些操作.
尝试(sleep 5; read x)&并在6秒后键入一个返回或东西,以便shell唤醒.那是你看到的东西......
[1] +停止(睡5;读x)
...然后键入fg以将其拉入前景.
最初,Unix有管道,它有&,但没有办法在前台和后台之间移动命令或管道,也无法帮助突然决定读取标准输入的后台进程.
Bill Joy和其他人在早期版本的BSD和csh(1)中添加了作业控制及其内核支持.这些是通过商业Unix逐行获取的,并被克隆用于类似工作的Linux内核.
关于进程组的问题和ps(1)...为了支持shell中的作业控制,内核进程状态包括进程组ID和会话ID.一个进程组和工作都是一样的东西,而是一个工号只是一个手柄外壳组成.如果会话ID与pid相同,则进程是会话负责人,如果pgid与pid相同,则进程是进程组负责人.我相信+那些ps(1)印刷品会发生一些更微妙的事情.每个终端都知道它的前台进程组是什么,所以我相信一个进程获得+如果pid == pgid &&(pgid是其控制终端的前景pg).
总之,内核保留了几个状态项:pid,pgid,sid,并且进程可以具有控制终端,终端可以具有前台pgid.这些凭据主要用于支持作业控制,但也用于在用户注销时撤消对终端的访问.