Fork () дочерние процессы с сигналами - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно разветвить два дочерних процесса, в которых заблокирована команда SIGINT, но один из них должен разблокировать ее при получении сигнала SIGTERM, в то время как другой дочерний процесс и родительский процесс оба печатают свои PID в результате того же SIGTERMсигнал.Второй дочерний процесс должен завершиться сразу же, но родительский процесс должен дождаться завершения своих дочерних процессов и затем остановиться.

Я только начал изучать программирование на C в Linux, и я не очень понимаю, как разветвляетсяи сигналы работают.Насколько я понимаю, этот код, который я написал до сих пор, будет ветвить процесс, и дочерний процесс будет блокировать команду Ctrl-C, и все это будет выполняться вечно, если я не уничтожу его командой kill -9 pid .

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void handler(int n) {
    write(STDOUT_FILENO, "I won't die!! Haha\n",13);
}

int main()
{
    pid_t pid = fork();
    if (pid < 0) {
        perror("Fork() error!");
        exit(-1);
    }
    if (pid == 0)
        signal(SIGINT,handler);
    while(1) {
        printf("Wasting the iteration. %d\n", getpid());
        sleep(1);
    }
    return 0;
}
  • Как использовать SIGTERM?Где мне это назвать?
  • Как заставить родителя создать еще один дочерний процесс, который тоже блокирует команду Ctrl-C?

1 Ответ

0 голосов
/ 23 октября 2018

Не уверен насчет разветвления нескольких процессов, так как я никогда этого не делал.С точки зрения SIGTERM, вам нужен обратный вызов для обработки сигнала завершения.Следующее - это то, что я использую во многих службах, которые я пишу:

/***************************************************************************************************
 * Function signal_callback_handler - allows for a graceful shutdown process.
 * *************************************************************************************************/
void signal_callback_handler(int signum) {
    //here we receive some sort of notification to terminate.
    //Log this event and change the state of the process control variable
    //so that the main processing loop knows to stop
    syslog(LOG_NOTICE, "Recived signal to shutdown - Signal %d", signum);
    //put code here to do preshutdown clean up, terminating threads, etc....
}

Затем вам нужно зарегистрировать обратный вызов для каждого сигнала завершения, с которым вы хотите иметь дело.Ниже приведены те, которые я помещаю в свою основную функцию перед тем, как форкнуть:

...