Обработка сигналов от дочернего процесса в Bash Scripts - PullRequest
3 голосов
/ 16 октября 2019

Я пытаюсь перехватить сигнал, вызванный дочерним процессом. Тем не менее, моя функция обратного вызова ловушки никогда не вызывается. У меня есть следующий тестовый код

#include <csignal>
#include <iostream>
#include <thread>
#include <chrono>

int main()
{
    std::this_thread::sleep_for (std::chrono::seconds(5));

    std::cout << ">>> Signal Sent!" << std::endl;
    raise(SIGUSR1);

    return 0;
}

И этот сценарий bash

set -bm
set -e 

KEEP_GOING=true

sigusr1()
{
    echo "SIGUSR1 Recieved"
    KEEP_GOING=false
}

trap sigusr1 SIGUSR1

./signalTest  &

while $KEEP_GOING ; do
    sleep 1s
    echo "Waiting for signal"
done

Когда я его запускаю, я получаю следующее

Waiting for signal
Waiting for signal
Waiting for signal
Waiting for signal
>>> Signal Sent!
[1]+  User defined signal 1   ./signalTest
Waiting for signal
Waiting for signal
Waiting for signal
Waiting for signal
Waiting for signal
^C

Из вывода, который я вижучто сигнал фактически отправлен, а в каком-то качестве получен. Однако функция обратного вызова в моей ловушке не выполняется.

Есть мысли?

1 Ответ

2 голосов
/ 16 октября 2019

raise отправляет сигнал вызывающему потоку.

kill отправляет сигнал указанному процессу или потоку.

Для отправки сигнала родительскому процессу вместо

raise(SIGUSR1);

do

#include <unistd.h>
// ...
kill(getppid(), SIGUSR1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...