脚本中缺少SIGINT?

时间:2020-06-01 11:47:45

标签: c++ c bash shell signals

当我尝试从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”)。

当我执行以下操作时,它完全可以正常工作

  • 从命令行将SIGINT发送到后台进程
  • 当进程处于前台时按CTRL-C
  • 显式设置默认信号处理程序:signal(SIGINT, SIG_DFL);

我可以使用不同的编译器(例如,具有Bash 5.0.16的Ubuntu 20.04,GCC 9.3.0)在不同发行版上重现它。理想情况下,我想了解发生了什么,但是暂时我会希望不需要更改可执行文件的变通方法。

1 个答案:

答案 0 :(得分:0)

@MohithReddy谢谢!您的提示使我得到一个答案,解释了为什么发生这种情况(在后台从脚本启动的进程具有SIGINT和SIGQUIT的SIG_IGN):https://unix.stackexchange.com/questions/478563/sleep-wait-and-ctrlc-propagation/478697#478697

现在,我只需要找到一种解决方法,即可让我运行默认情况下将SIGINT设置为SIG_DFL的可执行文件。