ветвление () и как сигналы поставляются процессам

Я должен был создать .profile файл с помощью входа в систему пользователя, и затем я должен был добавить:

echo $PATH

И затем я вышел из системы и назад на, и это сохранило его правильно.

12
28.12.2014, 21:25
1 ответ

Почему мы не пробуем его и не видели? Вот тривиальная программа с использованием сигнала (3) для ловушки SIGINT как в родительском, так и в дочернем процессе, и распечатывает сообщение, идентифицирующее процесс, когда он прибудет.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
    if (!fork()) {
        signal(SIGINT, &child_trap);
        sleep(1000);
        exit(0);
    }
    signal(SIGINT, &parent_trap);
    sleep(1000);
    return 0;
}

Давайте назовем это TEST.C . Теперь мы можем запустить его:

$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!

сигналы прерывания, генерируемые в терминале, доставляются в активную группу процессов, которая здесь включает как родитель, так и ребенок . Вы можете видеть, что оба Child_trap и Parent_trap были выполнены при нажатии Ctrl - C .

Существует длительное обсуждение . Длинное обсуждение взаимодействия между вилкой и сигналами в posix . Наиболее материальная часть этого здесь состоит в том, что:

сигнал, отправленный в группу процессов после FORK (), должен быть доставлен как родителю, так и для детей.

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

Другие полезные точки состоят в том, что:

  • сигнал вручную генерируемый и отправленный в отдельный процесс (возможно, с убийством ) будет доставлен только к этому процессу, независимо от того, Это родитель или ребенок.
  • Приказ о том, что обработчики сигналов работают между процессами, не определены, поэтому вы не можете полагаться на выполнение в первую очередь.
  • Если вы не не определяют обработчик прерывания (или явно игнорируют сигнал), оба процесса просто выйдут с помощью кода SIGINT (поведение по умолчанию).
  • Если человек обрабатывает сигнал не смертельно, а другой нет, то один без обработчика умрет, а другой будет продолжаться.
19
27.01.2020, 19:55

Теги

Похожие вопросы