我必须编写一个程序来模拟bash shell。该计划的相关部分在这里。程序在接收EOF(未示出)时终止。要实现的一个不同功能是在按下CTRL-C时不终止程序。如果收到SIGINT,程序应该再次打印一个新的命令提示符。我有一个处理函数,它改变一个全局变量来结束当前的循环迭代,然后是一个外部循环,它将再次改变它以重新进入内部循环。但是,当我按下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);
}
答案 0 :(得分:-1)
您必须在主功能
中注册信号处理程序功能把
(void)signal(SIGINT,SIGINT_handler);
进入主要功能后
试试这个
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;
}