Если я зарегистрирую пользовательский обработчик сигналов в процессе перед разветвлением, будут ли в последующих дочерних процессах также зарегистрирован пользовательский обработчик сигналов? - PullRequest
0 голосов
/ 10 октября 2018

Когда мы вызываем SIGINT (ctrl + c) для родительского процесса, я понимаю, что родительский процесс будет передавать сигнал своим дочерним процессам.Однако будут ли дочерние процессы обрабатывать сигнал так же, как родительский, при условии, что я зарегистрировал собственный обработчик сигналов перед разветвлением.Например:

void interruptHandler(int sig) {
    int thisPid = (int) getpid();
    while (1) {
        int childPid = wait(NULL);
        if (childPid == -1) break;
        printf("\t[%d] terminated.\n", childPid);
    }

    printf("PID[%d] Ended.\n", thisPid);
    exit(1);

}

int main(int argc, char const *argv[]) {
    if (signal(SIGINT, interruptHandler) == SIG_ERR) {
        printf("Handler registration error");
    }

    for (int count = 0; count < 10; count++) {
        int pid = fork();
        if (pid == 0) {
            return 0;
        }
    }

    while (1);
    return 0;
}

Выполнение Ctrl + C во время выполнения вышеуказанного процесса, похоже, создает у меня впечатление, что родительский элемент обрабатывает сигнал только с помощью пользовательского обработчика, в то время как дочерний процесс обрабатывает сигнал по умолчаниюобработчик.

Вот как выглядит вывод: 1

Есть ли способ заставить дочерние процессы использовать пользовательский обработчик?

Ответы [ 2 ]

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

Когда вы делаете это:

for (int count = 0; count < 10; count++) {
    int pid = fork();
    if (pid == 0) {
        return 0;
    }
}

Вы говорите дочерним процессам немедленно выйти из , чтобы у них никогда не было шанса получить сигнал.Вместо этого пусть дочерние элементы break выходят из цикла:

for (int count = 0; count < 10; count++) {
    int pid = fork();
    if (pid == 0) {
        break;
    }
}

Тогда дочерние процессы будут активны при нажатии клавиши CTRL-C.

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

Некоторые примечания: Ваше использование stdio плохо испорчено в отношении обоих сигналов и разветвления.Если (грубо говоря, подробные правила можно найти в POSIX XSH 2.5.1), вы очищаете поток перед разветвлением, только один разветвленный дочерний элемент может продолжать использовать данный поток (в вашем случае, stdout) после разветвления.В общем случае небезопасно вызывать функции, которые не классифицируются как «безопасные для асинхронных сигналов», также из обработчика сигналов, но до тех пор, пока вы не достигли цикла while, прежде чем нажмете Ctrl-C, это не должно повлиять на вас.

С учетом вышесказанного ваша проблема заключается в том, что ваши дочерние процессы немедленно завершаются:

if (pid == 0) {
        return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...