【发布时间】:2018-12-12 15:22:09
【问题描述】:
我正在使用 CLion 进行一些网络编程项目。当我使用套接字时,如果我不干净地关闭正在使用的套接字和其他网络对象,那么程序将阻塞端口,我将不得不自己使用命令行关闭它。
考虑到我必须在每次测试之间都这样做,这很烦人。所以我寻找当你点击“停止”时 CLion 杀死程序的方式,我发现它发送了一个 SIGINT 信号,here:
单击此按钮可通过以下方式从外部终止当前进程 标准关机脚本。 单击按钮一次调用软终止,允许应用程序 捕获 SIGINT 事件并执行正常终止(在 Windows 上, Ctrl+C 事件被模拟)。按钮点击一次后, 替换为图标 run tool window kill 表示后续 单击将导致应用程序强制终止,例如在 Unix 上 SIGKILL 已发送。
然后,我一直试图抓住它,但由于某些原因,它不起作用。
所以我尝试创建一个新项目,我只是想在其中捕捉SIGINT 信号。这是一个非常简单的非工作示例:
#include <iostream>
void signalHandling(int signal)
{
std::cout << "Signal : " << signal << std::endl;
}
int main() {
signal(SIGINT, signalHandling);
while (1)
{
;
}
}
我得到的只是:Process finished with exit code 1。
所以,我的问题是:为什么我不能捕捉到这个由 CLion 发送或至少应该发送的信号?
如果它可能与我的环境有关,我使用的是 CLion 2018.1.5,我的工具链是 Cygwin,我使用的是 cmake 3.10.3。我正在使用 Windows 10。
【问题讨论】:
-
进程退出后,即使没有明确关闭套接字,程序也不能阻塞端口。您只能在信号处理程序中使用 async signal safe 函数。您确定信号处理程序实际上正在安装吗?而且信号处理也没有在其他地方进行?
-
好吧,我猜这个过程并没有真正退出,因为我必须做 :
netstat -ano | findstr :8600找到它的pid然后能够用taskkill命令杀死它。代码真的很短,信号在其他任何地方都没有处理。不过,我不明白您所说的“实际上正在安装信号处理程序”是什么意思。 -
就像大多数 C 函数一样,
signal的错误处理是以返回码的形式执行的。因此,您必须检查返回的值并检查是否没有发生错误。虽然我不明白为什么signal会在这里失败。 -
创建一个minimal reproducible example。你有线程吗?
-
另外,您是在调试会话还是常规启动中尝试过此操作?看来 CLion 在调试会话中直接使用
SIGKILL。