C 信号处理功能+;不忽略SIGINT

C 信号处理功能+;不忽略SIGINT,c,signals,posix,C,Signals,Posix,我必须编写一个程序来模拟bashshell。节目的相关部分在这里。程序在接收到EOF(未显示)时终止。要实现的不同功能之一是在按下CTRL-C时不终止程序。如果收到SIGINT,程序应该只打印一个新的命令提示符。我有一个handler函数,它更改一个全局变量以结束当前循环迭代,还有一个外部循环,它将再次更改它以重新进入内部循环。但是,当我按下CTRL-C时,程序仍在退出。这是为什么 #include<stdio.h> #include<stdlib.h> #include

我必须编写一个程序来模拟bashshell。节目的相关部分在这里。程序在接收到EOF(未显示)时终止。要实现的不同功能之一是在按下CTRL-C时不终止程序。如果收到SIGINT,程序应该只打印一个新的命令提示符。我有一个handler函数,它更改一个全局变量以结束当前循环迭代,还有一个外部循环,它将再次更改它以重新进入内部循环。但是,当我按下CTRL-C时,程序仍在退出。这是为什么

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<time.h>
#include<signal.h>
#include<sys/wait.h>

void SIGINT_handler(int signum);

static volatile sig_atomic_t endflag = 0;

int main(int argc, char **argv){

    while(1){
        endflag = 0;

        while(!endflag){

                  struct sigaction action;

                  action.sa_handler = &SIGINT_handler;
                  action.sa_flags = 0;

                  if((sigemptyset(&action.sa_mask) == -1)||(sigaction(SIGINT, &action, NULL) == -1)){
                           perror("Failed to set SIGINT handler");
                           exit(EXIT_FAILURE);
                 }
         }
    }

    return 0;
}

void SIGINT_handler(int signo){

    if(signo == SIGINT){
        endflag = 1;
    }
    fflush(stdout);

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效信号处理器(信号处理器);
静态易失性sig_原子端标志=0;
int main(int argc,字符**argv){
而(1){
endflag=0;
而(!endflag){
结构动作;
action.sa_handler=&SIGINT_handler;
action.sa_标志=0;
if((sigeptySet(&action.sa|u mask)=-1)|(sigaction(SIGINT,&action,NULL)=-1)){
perror(“设置SIGINT处理程序失败”);
退出(退出失败);
}
}
}
返回0;
}
无效SIGINT_处理程序(int signo){
if(signo==SIGINT){
endflag=1;
}
fflush(stdout);
}

您必须在main函数中注册信号处理器函数

(无效)信号(SIGINT,SIGINT_处理器)

紧接着进入主功能

试试这个

int main(int argc, char **argv){

   (void) signal(SIGINT,SIGINT_handler);  

while(1){
    endflag = 0;

    while(!endflag){

              struct sigaction action;

              action.sa_handler = &SIGINT_handler;
              action.sa_flags = 0;

              if((sigemptyset(&action.sa_mask) == -1)||(sigaction(SIGINT, &action, NULL) == -1)){
                       perror("Failed to set SIGINT handler");
                       exit(EXIT_FAILURE);
             }
     }
}

return 0;

}

代码看起来大致正常。您在编译过程中是否收到任何警告?您使用的是哪个操作系统,哪个编译器?从信号句柄刷新stdout可能不是一个好主意。另外,我怀疑全局标志是否需要定义
volatile
。你需要发布操作系统和编译器,这是一个使用gcc和clang的Mac。我使用的是Ubuntu 15.10和gcc编译器。编译期间没有警告。在Debian old-stable上按预期工作。对
sigaction()
的调用也会注册一个信号处理程序。