2013-12-06 4 views
0

У меня есть fork & есть проблема, если 1 ветвь выходит, остальные остаются без изменений.
Под «бродячим», я имею в виду, что я вернулся в bash. & может вводить системные команды, но сервер постоянно выводит поверх моего курсора. Код, используемый для работы, убивая обе ветви, если я ^c. Поскольку добавление сокетов в микс, отключение клиента заставило сервер заблудиться.C Fork Stray Process

У кого-нибудь есть идеи, почему?

В моей основной():

printf("\n  Server Running Press ^c to quit\n\n"); 

if (!fork()) { // Debug output 
    while (1) { 
     // Do output stuff until ^c signal 
     fflush(stdout); 
    } 
} else { // Internets 
    while (1) { 
     clfd=accept(listenfd, (struct sockaddr*)&claddr, &claddrlen); 
     if (!fork()) { // Listener 
      close(clfd); 
     } else { // Communication branch 
      num=rand()%16; 
      //i=recv(clfd, &num, sizeof(num), 0); 
      send(clfd, &num, 1, 0); 
      close(clfd); 
      exit(0); 
     } 
    } 
    exit(0); 
} 

return 0; 

Это от пс:

PID TTY   TIME CMD 
11159 pts/8 00:00:00 sv_run 
11899 pts/8 00:00:00 sv_run 
11987 pts/8 00:00:00 ps 
21687 pts/8 00:00:01 bash 

Это является частью pstree:

|-sshd---sshd---csh 
|-sshd---bash---top 
|-2*[sv_run] 
|-8*[trashapplet] 
|-udevd---udevd 
+0

Можете ли вы показать вывод команды 'pstree'? – cyphar

+0

Я не знаю, что сервер больше не находится в фокусе, или клиенты заставляют сервер заблуждаться, но код не имеет большого смысла. Трудно сказать, слишком ли вы оставили слишком много в сокращении кода или если вы страдаете от некоторых недоразумений. – Duck

+0

Не был уверен, что было уместно вставить. – RandomClown

ответ

1

При нажатии управления + C, вы убиваете процесс которые создали несколько дочерних процессов. Убийство родителя по умолчанию не убивает дочерние процессы, и поэтому они продолжают работать, пока вы продолжаете работать в терминале. И поскольку все процессы имеют одно и то же устройство вывода, выход чередуется.

Я не уверен, что вы на самом деле ожидаете от своего кода. Я также не знаю, какую платформу вы используете. Но если так получится, что вы хотите убить процесс и все его дети на SIGINT, и вы используете Linux, вы можете попросить ядро ​​доставить SIGHUP после смерти родителя в ваших дочерних процессах. Для получения дополнительной информации о том, как это сделать, см. How to make child process die after parent exits?

Альтернативный вариант, вы должны заставить ваш сервер убивать свои дочерние процессы при выходе, например, используя пользовательский SIGINT signal handler.

Надеюсь, это поможет. Удачи!

+0

Проклятие себя. Это не совсем решение, но это заставило меня понять, что я ошибаюсь. Я думал, что fork() == 0 был родителем. Выключается 0 RandomClown

+0

Также это полезно знать, спасибо – RandomClown