LINUX.ORG.RU

Объясните нюанс с фоновым процессом


0

0

Всем привет.

В общем такая схема:
- запускаю в терминале процесс в фоновом режиме
  $ ./main &
  UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
  tvaroh    7722  7696  7722  7696  0 03:06 pts/2    00:00:00 ./main

- при наступлении определённого события (появления данных в fifo) этот процесс должен написать в stdout сообщение
- закрываю терминал и отправляю в fifo сообщение
- проверяю pgrep main - процесс всё ещё выполняется, хотя вроде как ему должен был отправиться сигнал SIGTTOU (никаких перехватов сигналов в коде нету)
- смотрю вывод ps:
  UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
  tvaroh    7722     1  7722  7696  0 03:06 ?        00:00:00 ./main

PPID сменился на 1 (init).

Собственно вопрос: почему так происходит?
★★★★

ну насколько я понимаю, после того как ты закрыл терминал убивается твой шелл. По какой-то причине сам процесс main не получает SIGHUP и не умирает. Так как его шелл-родитель умер, то его усыновляет init.

А SIGTTOU тут вообще не при делах

dilmah ★★★★★
()

Что-то мне подсказывает, что ./main следовало бы запускать вот так

nohup ./main &

А уж потом убивать терминал...

Uncle_Theodore ★★
()

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

anonymous
()
Ответ на: комментарий от anonymous

Зомбики вроде как "(имяпроц)" отображаются в ps, или в linux-е не так?

fmj
()
Ответ на: комментарий от dilmah

>ну насколько я понимаю, после того как ты закрыл терминал убивается твой шелл. По какой-то причине сам процесс main не получает SIGHUP и не умирает. Так как его шелл-родитель умер, то его усыновляет init.

> А SIGTTOU тут вообще не при делах

Ничего подобного, SIGHUP получают обычные процессы (не фоновые и не-демоны). Фоновый должен получить SIGTTOU при попытки записи на несуществующий терминал.

Вопрос остаётся в силе.

Bohtvaroh ★★★★
() автор топика
Ответ на: комментарий от Uncle_Theodore

> Что-то мне подсказывает, что ./main следовало бы запускать вот так

> nohup ./main &

Так ведь это совершенно другой случай, мне это не надо. Мне надо выяснить причину существующего поведения.

Bohtvaroh ★★★★
() автор топика

А куда у него указывает stdout (если смотреть через proc), и в каком этот процесс состоянии? В том смысле, что SIGTTOU по умолчанию останавливает (stop) процесс, а не завершает его.

Ну и можете еще потрассировать это процесс, чтобы убедиться, что он дествительно получает данные через fifo и пишет строку в stdout.

mky ★★★★★
()
Ответ на: комментарий от anonymous

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

Судя по всему это не зомби, ps умеет выводить соответствующую информацию, если это было бы так.

Bohtvaroh ★★★★
() автор топика
Ответ на: комментарий от mky

> В том смысле, что SIGTTOU по умолчанию останавливает (stop) процесс, а не завершает его.

Да, я упустил, что там остановка процесса, а не завершение (и видимо SITTOU приходит - скоро проверю дополнительно). Вопрос частично решён. Почему только родителем становится init - не понимаю.

Bohtvaroh ★★★★
() автор топика
Ответ на: комментарий от Bohtvaroh

>Почему только родителем становится init - не понимаю.

Когда у любого процесса "умирает" родитель, его родителем становится init. Когда вы закрывате терминал, запустивший этот процесс shell завершает работу, поэтому родителем main становится init

mky ★★★★★
()
Ответ на: комментарий от Bohtvaroh

тогда сиротинушка. мог попутать с устатку. да, скорее сиротинушка. папег потерялся, его init усыновил. возможно, и маску сигналов поменял.

anonymous
()
Ответ на: комментарий от anonymous

Точно, всем спасибо. :) Особенно mky.

Bohtvaroh ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.