我正在 try catch 子进程发出的信号。但是,我的陷阱回调函数从未被调用过。我有以下测试代码
#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);
关于c++ - 在 Bash 脚本中处理来自子进程的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58416798/