第一个终端:
$ 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} ---
sort
在输出任何内容之前必须读取所有输入(因为否则它如何排序所有内容?)。
由于您的第一次调用是从终端读取标准输入,您需要告诉终端您已完成提供ctrl-d的输入。然后它可以将所有排序的行写入其标准输出,该标准输出连接到第二个调用的标准输入,并退出,这将导致第二个sort
在读完所有第一个输出时依次看到EOF。