Не отправляйте SIGINT по CTRL+C дочерним процессам, но не игнорируйте сам сигнал
Я пытаюсь написать программу управления задачами, очень похожую на Supervisor.
Я запускаю некоторые программы из файла конфигурации и запускаю их в фоновом режиме, а в основном процессе я читаю и выполняю другие команды.
До fork()
-ing, в основном процессе я называю:
sigaction(SIGINT, &the_handler, NULL);
куда the_handler
хранит ссылку на простую функцию печати.
Когда нажаты клавиши CTRL+C, дочерние процессы также прерываются (чего я не хочу). Я мог бы бежать: signal(SIGINT, SIG_IGN);
после fork в дочернем процессе, чтобы игнорировать его, но я хотел бы все еще иметь возможность выполнить эту команду в bash: $ kill -n 2 <child_pid>
То есть я не хочу это игнорировать, верно?
Итак, как игнорировать SIGINT из CTRL+C для дочерних процессов, но при этом иметь возможность получать сигнал другими способами? Или я что-то упустил?
1 ответ
Традиционный способ сделать это состоит в том, чтобы раскошелиться дважды. Дедушка разветвляется на своих детей и ждет их. Каждый ребенок тут же разветвляется и выходит. Поскольку их родители вышли, внуки становятся родителями по pid 1. Таким образом, сигналы, отправленные прародителю, не передаются бывшим внукам.
Смотрите этот ответ для более подробной информации
/questions/3570067/linux-raznitsa-mezhdu-razvetvleniem-dvazhdyi-i-demonom-ise/3570081#3570081
ETA: Вам нужно вызвать setsid() между двумя вилками, в противном случае внук все еще находится в той же группе процессов, что и прародитель, и все равно будет получать сигналы, которые получает прародитель.