首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信号处理函数+不忽略SIGINT

信号处理函数+不忽略SIGINT
EN

Stack Overflow用户
提问于 2016-03-25 01:04:38
回答 1查看 466关注 0票数 0

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

代码语言:javascript
复制
#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);

}
EN

回答 1

Stack Overflow用户

发布于 2016-03-25 04:57:13

您必须在主函数中注册信号处理程序函数

(无效)信号(SIGINT,SIGINT_handler);

紧跟其后进入main函数

尝尝这个

代码语言:javascript
复制
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;

}

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36205964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档