我正在使用 CLion 进行一些网络编程项目。当我使用套接字时,如果我没有完全关闭正在使用的套接字和其他网络对象,那么程序将阻止该端口,我将不得不使用命令行自己关闭它。
考虑到我必须在每次测试之间执行此操作,这非常烦人。因此,我寻找了当您单击“停止”时 CLion 杀死程序的方式,我发现它发送了一个 SIGINT 信号,如下所示:
单击此按钮可通过标准关闭脚本从外部终止当前进程。单击该按钮一次将调用软终止,允许应用程序捕获 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)
{
;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的只是:Process finished with exit code 1。
所以,我的问题是:为什么我无法捕获 CLion 发送的信号,或者至少捕获应该发送的信号?
如果它可能与我的环境有关,我使用的是 CLion 2018.1.5,我的工具链是 Cygwin,我使用的是 cmake 3.10.3。我正在 Windows 10 上工作。
以下是我从@VTT 的帮助中得出的结论。
提供的示例应该可以工作,并且在不使用 CLion 时实际上也可以工作。我在实际运行的终端上尝试过CTRL-C,它有效。我的程序收到了SIGINT信号。
所以这个问题可能是 CLion 的错误,因为停止按钮实际上应该模拟CTRL-C并发送SIGINT信号。
我向 JetBrain 团队发送了一份错误报告,并将等待他们的最终反馈,并通知您。
再次感谢@VTT。
编辑 :
我确实联系了 CLion 支持人员,他们只是将我重定向到另一个 CLion 用户编写的另一个类似问题。所以我猜他们不会做任何事情。
经过一番研究,我进入了这个问题。几乎是同样的事情,除了它说 CLion 没有正确终止进程,这是我的情况。
显然,这是由于他们的停止脚本而导致的错误。我找到了一种方法让 CLion 真正结束这个过程。
您应该考虑更改注册表选项可能很危险!使用以下解决方案需要您自担风险!
这是我所做的:
run.processes.with.pty就是这样!
您必须知道,这不会让您捕获应该由 CLion 的“停止”按钮发送的 SIGINT 信号,但它确实会杀死进程,与停止按钮不同。另请注意,这不是问题的实际答案,但当我正在开发一个编程项目时,我必须手动终止我的服务器才能再次运行它。所以它解决了我的问题,也可能解决了别人的问题。
| 归档时间: |
|
| 查看次数: |
3153 次 |
| 最近记录: |