无法捕获CLion

时间:2018-07-04 08:41:07

标签: c++ signals clion

我正在使用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上工作。

2 个答案:

答案 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传递给我的进程并正常退出(对于我而言,这是我的意图)。

我不喜欢这种方法的地方是您需要执行太多步骤:

  1. 配置注册表以发送SIGINT而不是SIGSTOP(警告类似于souki的回答)
  2. 只要您想停止->暂停该过程即可。
  3. 发送命令handle SIGTRAP nostop noprint pass
  4. 继续该过程。