前台流程组和标准输入

时间:2019-04-29 07:35:13

标签: linux shell signals

第一个终端

$ 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)时,只有第一个sortpid = 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} ---

1 个答案:

答案 0 :(得分:0)

tt_content.stdWrap.dataWrap > tt_content.stdWrap.prepend.dataWrap > tt_content.stdWrap.innerWrap.cObject.66.10 > 必须先读取所有输入,然后才能输出任何内容(否则它将如何对所有内容进行排序?)。

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