Fork, exec -> мужчина.Не работает правильно - PullRequest
0 голосов
/ 12 декабря 2010

В этом случае я написал простую прогу:

int main()
{
  pid_t chpid;
  chpid=fork();
  if(chpid==0) // child
  {
    sleep(2);
    execlp("/usr/bin/man","/usr/bin/man","ps",NULL);
    printf("still alive\n");
  }
  else
  {
    printf("parent goes down\n");
  }
  return 0;

}

Во время работы родительского штампа через 2 секунды я получаю: /usr/bin/man: command exited with status 1: pager -s

Почему это так? определенно, проблема в смерти родителя, если я добавлю while (1) в родительский код, то все в порядке.

Я написал тест-прогу, которая записывает некоторую строку в стандартный вывод каждый период времени. Оно работает. Кажется странным.

Ответы [ 3 ]

1 голос
/ 13 декабря 2010

Выходя из родительского процесса во время работы child, вы только что демонизировали дочерний элемент.У демонов и их вилок нет управляющего терминала, который необходим для запуска пейджера (я считаю, pager -s - это less(1), но проверьте его: man pager).

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

Более подробное объяснение см. В « Расширенное программирование в среде UNIX » Ричарда Стивенса о группах процессов, сеансах и управляющих терминалах.

0 голосов
/ 18 декабря 2010

Итак.Небольшое исследование показало, что оболочка, запустив мой процесс, устанавливает управляющий терминал на него (мой процесс) на setpgid().Когда он умирает, оболочка снова вызывает setpgid(), несмотря на все дочерние элементы, которые fork 'редактировал мой proc.Так что они уже демоны.Как я обнаружил, демоны также могут выполнять некоторые выходные процедуры, но они определенно не имеют успеха в этом.Может быть да, может быть нет.Вот почему childs по-прежнему может выводить данные после смерти своих родителей (например, если я раскошелюсь на простую пириодическую программу Hello World).И человек понимает, что что-то изменится с его результатами, и начинает паниковать.Вот как я это вижу.

Что касается strace, то все довольно просто: strace все еще жив в течение всего жизненного цикла моих программ, поэтому проблем с этим выводом нет.

0 голосов
/ 12 декабря 2010

Используйте wait(3p), чтобы дождаться смерти ребенка.

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