第一个终端:
$ 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第一个的输出。
关于linux - 前台进程组和标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55898833/