前台进程组和标准输入

问题描述 投票:0回答:1

第一个终端:

$ sort | sort

第一个的pid是1,第二个的pid是2。

第二个终端:

$ strace -p 1

strace: Process 1 attached
read(0, 

第三个终端:

$ strace -p 2
strace: Process 2 attached
read(0, 

第四个终端:

$ ps l

0  1000  1  6891  20   0  27464   912 wait_w S+   pts/2      0:00 sort
0  1000  2  6891  20   0  27464   924 pipe_w S+   pts/2      0:00 sort

什么指出sort进程都是前景。然而,当我把任何字符(A)放到第一个终端strace点时,只有第一个sort(用pid = 1)得到输入:

read(0, "A\n", 130048)                  = 2

但是,当我通过按Ctrl-C发送SIGINT时,两个sort进程都获得了信号。为什么?

--- SIGINT {si_signo=SIGINT, si_code=SI_TKILL, si_pid=1, si_uid=1000} ---
--- SIGINT {si_signo=SIGINT, si_code=SI_TKILL, si_pid=2, si_uid=1000} ---
linux shell signals
1个回答
0
投票

sort在输出任何内容之前必须读取所有输入(因为否则它如何排序所有内容?)。

由于您的第一次调用是从终端读取标准输入,您需要告诉终端您已完成提供ctrl-d的输入。然后它可以将所有排序的行写入其标准输出,该标准输出连接到第二个调用的标准输入,并退出,这将导致第二个sort在读完所有第一个输出时依次看到EOF。

© www.soinside.com 2019 - 2024. All rights reserved.