在 Bash 个脚本中处理来自子进程的信号

Handling signals from child process in Bash Scripts

我正在尝试捕获子进程发出的信号。但是,我的陷阱回调函数从未被调用过。我有以下测试代码

#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

从输出中我看到信号实际上已经发送,并且以某种方式被接收。但是我的陷阱中的回调函数没有执行。

有什么想法吗?

raise 将信号发送到调用线程。

kill 向指定的进程或线程发送信号。

将信号发送给父进程,而不是

raise(SIGUSR1);

#include <unistd.h>
// ...
kill(getppid(), SIGUSR1);