【问题标题】:Eclipse for C/C++ Developers and Ctrl+C适用于 C/C++ 开发人员和 Ctrl+C 的 Eclipse
【发布时间】:2016-08-16 07:54:00
【问题描述】:

我使用 Eclipse for C/C++ Developers 版本来编写必须通过发送信号 SIGINT 来响应 Ctrl+C 单击的代码。但是,当我从控制台运行代码时,我发现它根本不响应 Ctrl+C。我禁用了 Ctrl+C 作为复制键盘映射的功能,但它仍然没有解决问题。 你知道我能做些什么来解决它吗?

代码示例:

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>


static void sig_int(int num) {
    printf("\nerror\n");
}

int main (int argc, char *argv[]) { //7

    sigset_t    zeromask;

    if (signal(SIGINT, sig_int) == SIG_ERR)
                    fprintf(stderr,"signal(SIGINT) error");

    printf("Hello\n");

    if (sigsuspend(&zeromask) != -1)
        fprintf(stderr,"sigsuspend error");

}

如果您从 Linux 终端运行此代码,当您单击“Ctrl+C”时,您将获得“错误”输出。但是,从 Eclipse 控制台运行它,什么都不会发生。 Eclipse 控制台不会将 Ctrl+C 视为键盘中断。

【问题讨论】:

  • 请发布一些代码,除非您说它可以在终端上运行,但不能从 ecrise 的控制台运行。
  • 我编辑了我的帖子并添加了一些代码。
  • @Rei,对不起,它仍然没有帮助我。我找不到 Eclipse 的 pid。我尝试输入终端“ps”和“jobs”,但没有得到任何引用 Eclipse 的信息。

标签: c linux eclipse signals sigint


【解决方案1】:

原因是 gdb 正在捕获 SIGINT 信号而不是传递它。

如果您进入 gdb 控制台(带有 gdb 版本的控制台;而不是标有“traces”的控制台)并输入“信息信号”,您将看到如下列表:

info signals
Signal        Stop  Print   Pass to program Description

SIGHUP        Yes   Yes Yes     Hangup
SIGINT        Yes   Yes No      Interrupt
SIGQUIT       Yes   Yes Yes     Quit
SIGILL        Yes   Yes Yes     Illegal instruction

请注意,SIGINT 的 Pass 设置为 NO。

输入:处理 SIGINT 通行证

gdb 也使用 SIGINT,因此它可能会询问您是否真的确定。

编辑

当我从 Eclipse 尝试一个简单的程序时,该程序在暂停之前没有接收到 SIGINT。这可能是 Eclipse 的问题。直接从 gdb 运行时,程序按预期运行。

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2018-03-16
    相关资源
    最近更新 更多