我正在使用CLion进行一些网络编程项目。在我使用套接字时,如果我没有干净地关闭我正在使用的套接字和其他网络对象,那么程序将阻塞该端口,而我将不得不使用命令行自行关闭它。
这很烦人,考虑到每次测试之间我都必须这样做。因此,我寻找了CLion在您单击“停止”时杀死程序的方式,发现它会发送SIGINT信号here:
单击此按钮可通过 标准关机脚本。 单击该按钮一次将调用软终止,从而允许应用程序执行以下操作: 捕获SIGINT事件并执行正常终止(在Windows上, (将模拟Ctrl + C事件)。单击一次按钮后,它是 替换为运行工具窗口的图标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上工作。
答案 0 :(得分:3)
这是我从@VTT的帮助中得出的结论。
提供的示例应该起作用,并且在不使用CLion时实际上可以起作用。我尝试在实际上做CTRL-C
的终端上工作,它确实有效。我的程序收到了SIGINT
信号。
所以这个问题可能是一个CLion错误,因为实际上应该使用停止按钮来模拟CTRL-C
并发送一个SIGINT
信号。
我向JetBrain的团队发送了一个错误报告,将等待他们的最终反馈,并告诉您。
再次感谢@VTT。
编辑:
我确实联系了CLion支持人员,他们只是将我重定向到另一个CLion用户编写的另一个类似的issue。所以我想他们不会做任何事情。
经过一些研究,我去了issue。几乎相同,只是说CLion无法正确终止进程,这就是我的情况。
显然,由于其停止脚本,这是一个错误。我找到了一种使CLion实际结束该过程的方法。
您应该考虑更改注册表选项可能很危险!使用以下解决方案,后果自负!
这就是我所做的:
run.processes.with.pty
就是这样!
您必须知道,这将不允许您捕获应该由CLion的“停止”按钮发送的SIGINT信号,但是与停止按钮不同,它确实会终止该过程。另请注意,这并不是该问题的实际答案,但是当我在进行编程项目时,必须手动杀死服务器才能再次运行它。这样就解决了我的问题,也可能解决了其他人的问题。
答案 1 :(得分:0)
我一直在寻找相同的问题,并遇到了以下由Employed Russian撰写的answer。这不是理想的选择,但是我能够将SIGINT传递给我的进程并正常退出(对于我而言,这是我的意图)。
我不喜欢这种方法的地方是您需要执行太多步骤:
handle SIGTRAP nostop noprint pass