linux - 前台进程组和标准输入

标签 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 指向只有第一个 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/

相关文章:

c++ - 程序可以在调用 kill 函数之前返回/终止吗?

python - SIGINT 如何传递给孙子(以及如何以编程方式执行此操作)

linux - ARI 身份验证( Asterisk )

c - 是否可以在终端上以更慢的速度运行命令行程序?

c++ - isspace 宏与 locale_facets.h 中的 isspace 函数冲突

Linux Bash,删除以空格分隔的文件

bash - 终端:排序命令;如何正确排序?

android - UIAutomator 2 在运行 API 级别低于 21 的设备上运行 Shell 命令

Python 根据字符串从 1 个文件创建 3 个文件

unix - 执行程序和终止程序时的信号和中断