2013-12-15 6 views
2

Я не уверен в более сложных сигналах и вилках. Есть ли разница между сигнальным вызовом от ребенка или родителя?Как использовать вилку с сигналами?

Когда ребенок разветвлен, теперь он родитель, а ребенок только для предыдущего родителя?

Поскольку обработчик включен, по умолчанию обработчик недействителен. Так можете ли вы изменить SIGINT, чтобы не прекратить процесс?

int count = 0; 

void killhandler(int sig){ 
    printf("SIGKILL received\n"); 
    return; 
} 

void childhandler(int sig){ 
    int status; 
    wait(&status); 
    count += WEXITSTATUS(status); 
    return; 
} 

main(){ 
    int i; // for loop iterator 
    pid_t pid[3]; // pids of child processes 
    Signal(SIGKILL, killhandler); 
    Signal(SIGCHLD, childhandler); 
    // Fork 3 child processes 
    for(i=0; i<3; i++){ 
     pid[i] = fork(); 
     if(!pid[i]){ // If child process 
      Signal(SIGKILL, SIG_DFL); 
      exit(5); 
     } 
    } 

    // Parent process only 
    for(i=0; i<3; i++){ 
     kill(pid[i], SIGKILL); 
    } 
    sleep(5); 
    printf("count = %d\n", count); 

    exit(0); 
} 

Почему "SIGKILL received" не печатается?

Почему может рассчитывать только быть: 0, 5, 10, 15

ответ

1

Когда дочерний процесс разветвляется, она очень близка к точной копии родительского процесса. С однопоточных процессов, существует три основных отличия:

  1. Родитель идентификатор процесса различна
  2. Процесс ID отличается.
  3. Возвращаемое значение fork() отличается

(Для других отличий, смотрите страницу POSIX человека для fork().) Обработчики сигналов у ребенка такие же, как в родительском. Тем не менее, ребенок может и независимо изменять любой из своих обработчиков сигналов.

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

2

Есть ли разница между сигнальным вызовом от ребенка или родителя?

С точки зрения того, как это влияет на процесс приема сигнала, нет.

Когда ребенок разветвлен, теперь он родитель, а ребенок только для предыдущего родителя?

Это определенно ребенок его родителя. Независимо от того, станет ли он сам родителем, зависит от того, развивает ли он своих собственных детей.

Поскольку обработчик включен, по умолчанию обработчик недействителен. Могли бы вы изменить SIGINT, чтобы не прекратить процесс?

По умолчанию SIGINT - это прекратить процесс, но вы можете поймать и обработать SIGINT, или вы можете заблокировать или проигнорировать его. Назначение по умолчанию не так сильно недопустимо, как переопределено до (и если) вы снова его измените.

Почему «SIGKILL received» никогда не печатается?

Вы не можете блокировать, игнорировать или улавливать SIGKILL. Вы не увидите, что ваш обработчик печатает что-либо, потому что он никогда не будет вызван для SIGKILL. SIGSTOP также нельзя игнорировать, блокировать или обрабатывать. Это два специальных сигнала в этом отношении.

В вашей программе вы пытаетесь установить SIGKILL по умолчанию, на самом деле его только, расположение у детей. Так как ваши дети немедленно выходят, сигнал от родителя никогда не может быть доставлен, потому что дети уже мертвы, а kill в родительском элементе может быть неудачным с ESRCH, например. ни один ребенок с этим pid не существует. A sleep было бы полезно там, чтобы они могли жить достаточно долго, чтобы их убили. (Должен любить эту терминологию.)

Ваше использование WEXITSTATUS неверно. Если ваше намерение состоит в том, чтобы подсчитать количество детей, которые выходили по собственному желанию, а не быть убитыми, вам, вероятно, просто нужен простой счетчик, использующий WIFEXITED или WIFSIGNALED. WEXITSTATUS возвращает код состояния дочернего элемента, который вышел из него самостоятельно. Это может быть 0 или 1 или 50 или 75. Добавление его к переменной, вероятно, не является тем, что вы хотите.

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

Смежные вопросы