Группа процессов переднего плана и стандартный ввод - PullRequest
0 голосов
/ 29 апреля 2019

первый терминал:

$ 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

ОднакоКогда я посылаю SIGINT нажатием Ctrl-C, оба процесса 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 голосов
/ 29 апреля 2019

sort должен прочитать все свои входные данные, прежде чем что-либо выводить (так как иначе как все можно отсортировать?).

Поскольку ваш первый вызов - чтение стандартного ввода с терминала, вам нужно сообщить терминалу, что вы завершили ввод данных с помощью ctrl-d. Затем он может записать все отсортированные строки на свой стандартный выход, который подключен к стандартному входу второго вызова, и завершиться, что заставит второй sort, в свою очередь, увидеть EOF, когда он завершит чтение всех выходных данных первого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...