Я пишу небольшую программу оболочки, пытаясь обработать сигнал Ctrl + C, я хочу попытаться напечатать новую строку, когда она нажата.
Вот мой код для этого.
static sigjmp_buf env;
void sigint_handler(int signo){
siglongjmp(env, 42);
}
void myShellLoop(){
int parserStatus;
signal(SIGINT, sigint_handler);
while(1){
if(sigsetjmp(env,1)==42){
printf("\n");
continue;
}
//Initialize a new command, to parse and execute.
initializeGlobalCommand();
parserStatus = yyparse();
if(parserStatus == 0)
executeShellCommand();
else
printf("Not a valid shell command\n");
}
}
Но после того, как я нажимаю Ctrl + C, он переходит на новую строку, но затем flex дает мне эту ошибку:
fatal flex scanner internal error--end of buffer missed
Вот скриншот:
Как правильно обрабатывать ctrl + c?
Редактировать: Фрагмент кода для fork ():
int execute(int cmdNumber){
pid_t pid;
int status;
pid = fork();
if(pid == 0){
signal(SIGINT, SIG_DFL);
if(execvp(globalCommand.sCommands[cmdNumber].arguments[0], globalCommand.sCommands[cmdNumber].arguments) == -1){
perror("myShell: Command error");
exit(EXIT_FAILURE);
}
}
else if(pid < 0){
//Error forking.
perror("myShell");
}
else{
do{
waitpid(pid, &status, WUNTRACED);
}while(!WIFEXITED(status) && !WIFSIGNALED(status) && !globalCommand.background);
}
return 1;
}