Я должен был создать .profile файл с помощью входа в систему пользователя, и затем я должен был добавить:
echo $PATH
И затем я вышел из системы и назад на, и это сохранило его правильно.
Почему мы не пробуем его и не видели? Вот тривиальная программа с использованием сигнала (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
(поведение по умолчанию).