当我尝试从bash脚本发送SIGINT时,我遇到非常奇怪的行为:
#!/bin/bash
./executable 6 &
PID=$!
sleep 2
kill -s SIGINT $PID
sleep 2
if wait $PID; then
echo "FAILURE"
else
echo "SUCCESS"
fi
从没有设置信号处理程序的C ++代码(g++ source.spp --std=c++11 -o executable
)编译的可执行文件:
#include <iostream>
#include <chrono>
#include <thread>
int main(int argc, char* argv[])
{
std::this_thread::sleep_for(std::chrono::seconds(std::atoi(argv[1])));
std::cout << std::endl << "FINISHED" << std::endl;
}
该过程不会终止(我得到的是“ FAILURE”,然后是“ FINISHED”)。
当我执行以下操作时,它完全可以正常工作
:signal(SIGINT, SIG_DFL);
我可以使用不同的编译器(例如,具有Bash 5.0.16的Ubuntu 20.04,GCC 9.3.0)在不同发行版上重现它。理想情况下,我想了解发生了什么,但是暂时我会希望不需要更改可执行文件的变通方法。
答案 0 :(得分:0)
@MohithReddy谢谢!您的提示使我得到一个答案,解释了为什么发生这种情况(在后台从脚本启动的进程具有SIGINT和SIGQUIT的SIG_IGN):https://unix.stackexchange.com/questions/478563/sleep-wait-and-ctrlc-propagation/478697#478697
现在,我只需要找到一种解决方法,即可让我运行默认情况下将SIGINT设置为SIG_DFL的可执行文件。