Я запускаю cat в терминале:

$ cat

Затем во второй терминал я посылаю сигнал остановки:

$ kill -SIGSTOP $(pgrep cat)

И это работает - cat остановлена. Теперь я хочу разбудить этот процесс cat , отправив SIGCONT:

$ kill -SIGCONT $(pgrep cat)

И ничего не происходит. Однако если я использую fg в первой оболочке, то cat будет разбужен. Почему SIGCONT не продолжает казнить cat ?

1 ответ1

2

Нажатие «ctrl-Z» в оболочке приостанавливает текущий процесс переднего плана, посылая ему сигнал STOP . Это (я полагаю) также приводит к тому, что стандартный ввод процесса отсоединяется от оболочки - теперь это фоновый процесс.

Команда bg отправляет сигнал CONTINUE в команду, но не подключает ее стандартный ввод к оболочке. Так как кошка ждет на стандартном входе, она остается остановленной. Как вы упомянули, команда fg действительно соединяет стандартный ввод с оболочкой.

Когда вы отправляете сигнал STOP вашему процессу, оболочка уведомляется через сигнал CHILD и помещает его в фоновый режим, и происходит то же самое.

Вы можете увидеть разницу, когда вы нажмете «Ctrl-Z»:

[1]  + 8336 suspended  cat

И когда вы отправляете сигнал STOP вручную:

[1]  + 8336 suspended (signal)  cat

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .