2016-03-16 8 views
2

Как перевоспитание остановленного процесса heppens? Почему остановленный процесс просто прекращается после повторного воспитания?переустановление остановленного процесса

Точнее, предположим, что у меня есть код, как этот

#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <sys/user.h> 
#include <sys/syscall.h> 
#include <stdio.h> 


int main(void) { 
    pid_t child; 

    child = fork(); 

    if (child == 0) { 
     int t = 0; 
     while (true) { 
      printf("%d. I'm %d, my parent is %d\n", t++, getpid(), getppid()); 
      sleep(1); 
     } 
    } else { 
     printf("I'm the parent. My pid is %d\n", getpid()); 
     printf("Starting to wait for 30 seconds\n"); 
     sleep(30); 
     printf("Done waiting, aborting\n"); 
    } 
} 

Когда я запускаю этот код процесс дочерний процесс работает и родитель просто спит. По прошествии 30 секунд родительский процесс завершается, и дочерний процесс теперь становится дочерним элементом init и продолжает работу. Все нормально.

Но если я запускаю этот код и в первые 30 секунд, это исполнение я также запустить

kill -SIGSTOP <child_pid>

Затем дочерний процесс останавливается (T состояние в ps xaf) и родительский процесс спит. По прошествии 30 секунд родительский процесс возвращается из сна и просто заканчивается (по мере того, как он достиг конца main), но дочерний процесс вместо повторного воспроизведения на init в остановленном состоянии просто завершается. Я не вижу его в ps xaf и если запустить lastcomm я вижу этот вывод:

a.out    F X equi  pts/5  0.00 secs Wed Mar 16 17:44 

Почему это происходит, что остановленный процесс умирает после повторного воспитания детей? Возможно ли в linux перезагрузить процесс остановки?

+0

Почему вы хотите это сделать? – nzc

+1

@nzc есть такая вещь, как 'criu' (см. Criu.org или https://github.com/xemul/criu). Я хочу добавить функцию' --leave-stop' в 'criu restore' (она в настоящее время только доступно с 'criu dump') – PepeHands

+0

Я думаю, что вы можете получить лучшие результаты, если вы включите некоторые из этих деталей в свой вопрос. Я думаю (но не уверен), что часть проблемы заключается в том, что вы можете использовать сигналы управления работой так, как они не предназначены для использования. Включение контекста для того, почему вы хотите использовать их, может помочь кому-то, кто знает, объяснить, почему и, возможно, предложить правильный подход. – nzc

ответ

1

От http://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html

Когда процесс в осиротевшей группы процессов (см Orphaned процесс группы) получает SIGTSTP, SIGTTIN, или сигнал SIGTTOU и не обрабатывать его, процесс не останавливается. Остановить процесс будет , вероятно, не очень полезно, так как нет оболочки программы, которая будет Обратите внимание, что остановить и позволить пользователю продолжить его. Вместо этого зависит от операционной системы, которую вы используете. Некоторые системы могут делать ничего; другие могут выдавать другой сигнал, например SIGKILL или SIGHUP. В системах GNU/Hurd процесс умирает с SIGKILL; этот избегает проблемы многих остановленных, осиротевших процессов, лежащих около системы.

Смотрите также: What's the difference between SIGSTOP and SIGTSTP?

+0

На самом деле я не понимаю, как здесь могут встречаться «SIGTSTP», «SIGTTIN» или «SIGTTOU». В документе, который вы предоставили в письменном виде: «Когда группа процессов становится сиротой, ее процессы отправляются сигналом SIGHUP». Означает ли этот сигнал прекращение моей дочерней программы? Если да, то почему этот сигнал не прерывает мою программу, если она не остановлена? – PepeHands

+1

Я думаю, что настоящая причина здесь: «остановлено» - это состояние, которое имеет смысл только в том случае, если процесс имеет «управление заданиями», потому что тогда его можно будет перезапустить позже.Я думаю, что когда процесс теряет контроль над работой, система отправляет его SIGHUP, потому что иначе он просто будет остановлен навсегда. См. Последнюю строку «... это позволяет избежать проблемы многих остановленных, осиротевших процессов, лежащих вокруг системы». – nzc

+0

Кроме того, повторно прочитав свой комментарий, не будет отправлено сообщение «SIGHUP», когда ваш процесс не будет остановлен. SIGHUP отправляется, потому что ваш процесс * * остановлен, когда он становится сиротским процессом. – nzc