Почему такие команды, как cat, сразу выходят при запуске в фоновом режиме? - PullRequest
0 голосов
/ 19 мая 2019

Я делаю пользовательскую оболочку в c, и я не совсем уверен, как работают процессы, работающие в фоновом режиме.

Я думал, что у меня довольно хороший захват, но я не уверен, чтопроисходит с файловым дескриптором 0, например.

Команда типа 'cat', когда передается без аргументов, ожидает ввода от stdin.

Если вы запускаете cat в фоновом режиме без аргументов (например, cat&), он будет немедленно прекращен.Почему это происходит на самом деле, был ли файл-дескриптор cat 0 закрыт каким-то образом?

Я попытался обработать это, установив для файлового дескриптора 0 значение / dev / null, но затем cat жалуется на наличие плохого файлового дескриптора.

Любая информация о том, как оболочка на самом деле обрабатывает stdin для фоновых процессов, будет очень полезна!

Обновление: установка fd 0 в / dev / null работает, но так ли это на самом деле делает оболочка?Устанавливает ли оболочка дескриптор файла 0 фонового процесса в / dev / null?Если это так, что делает оболочка, если вы переходите на передний план, устанавливает ли она значение 0?(кстати, я делаю это для первого процесса в трубе, если существует более одного процесса)

1 Ответ

3 голосов
/ 19 мая 2019

Вот что происходит, когда я запускаю cat в фоновом режиме:

$ cat&
[1] 19322
$ 

[1]+  Stopped                 cat
$

Обратите внимание, что процесс cat не завершен.Он был приостановлен.

$ jobs
[1]+  Stopped                 cat
$ ps u 19322
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
rici     19322  0.0  0.0  11788   784 pts/4    T    01:48   0:00 cat

Фоновые задачи не могут считываться с терминального устройства.Когда они пытаются это сделать, они получают сигнал SIGTTIN.Действие по умолчанию, связанное с этим сигналом, - остановить задачу.Но это не было прекращено;вы все еще можете оживить его, вернув его на передний план:

$ fg
cat
Hello, world!
Hello, world!

Подробное объяснение можно найти в APUE , раздел 9.8.

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