C/C+的Eclipse+;开发者和Ctrl+;C

C/C+的Eclipse+;开发者和Ctrl+;C,c,linux,eclipse,signals,sigint,C,Linux,Eclipse,Signals,Sigint,我使用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 si

我使用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");

}
#包括
#包括
#包括
静态void sig_int(int num){
printf(“\n错误\n”);
}
intmain(intargc,char*argv[]){//7
sigset_t零掩模;
if(信号(SIGINT,sig_int)=sig_ERR)
fprintf(标准,“信号(SIGINT)错误”);
printf(“Hello\n”);
如果(SIGSSUSPEND(&zeromask)!=-1)
fprintf(标准“SIGSSUSPEND错误”);
}

如果您从Linux终端运行此代码,当您单击“Ctrl+C”时,您将得到一个“错误”输出。然而,如果您从Eclipse控制台运行它,则不会发生任何事情。Eclipse控制台不将Ctrl+C视为键盘中断

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

如果您转到gdb控制台(具有gdb版本的控制台;而不是标记为“traces”的控制台)并输入“info signals”,您将看到如下列表:

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

输入:handle SIGINT pass

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

编辑


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

请发布一些代码,除非您说它是从终端运行的,而不是从eclise的控制台运行的。我编辑了我的帖子并添加了一些代码@丽,对不起,这对我还是没有帮助。我找不到Eclipse的pid。我试图输入终端“ps”和“jobs”,但没有得到任何引用Eclipse的信息。