Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 有作业意识的shell与无作业意识的shell程序执行_Linux_Shell_Unix_Ipc - Fatal编程技术网

Linux 有作业意识的shell与无作业意识的shell程序执行

Linux 有作业意识的shell与无作业意识的shell程序执行,linux,shell,unix,ipc,Linux,Shell,Unix,Ipc,当我阅读APUEV3时,更具体地说,我发现自己无法掌握一些东西。 首先,让我们假设我在UNIX shell中运行以下管道程序: cat /etc/passwd | grep -i alex | awk -F : '{print $3}' | less 在第一个示例中,假设我使用的是一个不知道作业的shell(sh) 这本书解释说,在这种情况下,最终的ps-opid,ppid,pgid,comm是这样的(假设shell的pid是10,ppid是5) 在第二个示例中,假设我们使用的是作业感知she

当我阅读APUEV3时,更具体地说,我发现自己无法掌握一些东西。 首先,让我们假设我在UNIX shell中运行以下管道程序:

cat /etc/passwd | grep -i alex | awk -F : '{print $3}' | less
在第一个示例中,假设我使用的是一个不知道作业的shell(sh)

这本书解释说,在这种情况下,最终的ps-opid,ppid,pgid,comm是这样的(假设shell的pid是10,ppid是5)

在第二个示例中,假设我们使用的是作业感知shell(bash):

问题是,为什么在第二种情况下,进程是shell的子进程,而不是最后一个进程的子进程(第一种情况下是这样),并且假设shell为它的每个子进程接收一个SIGCHLD,那么子进程之间不存在某种竞争条件吗

请注意,对不起,缩进错误。我现在就去修 谢谢 亚历克斯

问题是,为什么在第二种情况下,进程是shell的子进程,而不是最后一个进程的子进程[…]

因为这是正确的行为。只有shell中的bug可以解释为什么
less
会是管道中其他进程的父进程。
less
无法处理其他进程的SIGCHLD,因为它尚未启动它们。(更重要的是,由于
less
中的系统调用因EINTR错误而失败,这也会导致问题。)这也意味着除
less
之外的所有进程都将由PID 1获得,而不是shell,因为它将接收它们的
SIGCHLD

否则,进程的父子关系与“作业感知shell”无关。作业感知shell做两件事:它实现作业控制(
jobs
fg
bg
命令),并将自己设置为会话引导程序(使用syscall),以便在终止(shell)时将SIGHUP自动发送到所有子进程

[…]假设shell为它的每个孩子都收到了一个信号,那么孩子之间不会发生某种种族状况吗


竞态条件是指事情没有按预期顺序执行的情况。在这里,没有预期的顺序。大多数过滤器应用程序(如
grep
:从stdin读取,写入stdout)在stdin上看到EOF时会立即终止。通常情况下,管道中的第一个进程可能在最后一个进程看到任何输入时已经终止。这是正常的。他们收获了,但他们的产出已经被输送到管道中,将被正常处理。

试图理解你的问题……你的意思是,当孩子们死亡时,他们可能不按时间顺序死亡,这是一种种族条件吗?在这两种情况下,命令都将按顺序处理(由shell处理),因此,这不会造成问题。。。
PID     PPID     PGID     COMM
10       5       10        sh
11       10      10        less
12       11      10        cat /etc/passwd
13       11      10        grep -i alex
14       11      10        awk -F : '{print $3}'
PID      PPID     PGID     COMM
10       5       10        bash
11       10      11        cat /etc/passwd
12       10      11        grep -i alex
13       10      11        awk -F : '{print $3}'
14       10      11        less