gpt4 book ai didi

c - 处理 CTRL C 时错过错误 "fatal flex scanner internal error--end of buffer"

转载 作者:行者123 更新时间:2023-11-30 16:18:29 24 4
gpt4 key购买 nike

我正在编写一个小型 shell 程序,在尝试处理 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

这是一个屏幕截图: enter image description here

如何正确处理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;
}


最佳答案

你“残酷地”走出 (f)lex(/yacc/bison) 代码返回到 myShellLoop,因此引入不一致也就不足为奇了

重新定义YY_INPUT,当control-c被点击时返回一个特殊字符,以返回在解析器中管理的特殊值/ token 来调用yyerror 以正常方式中止

例如在您的词法分析器文件中:

%{
...
extern void my_yy_input(char*, int *, int);

#undef YY_INPUT
#define YY_INPUT(b,r,s) my_yy_input(b,&r,s)

%}
...

static sigjmp_buf env;              

void sigint_handler(int signo){
siglongjmp(env, '@');
}

void my_yy_input( char * buff, int * nRead, int maxToRead )
{
*nRead = 1;

if(sigsetjmp(env,1 ) == '@') {
*buff = '@';
return;
}

*buff = getchar();
}

关于c - 处理 CTRL C 时错过错误 "fatal flex scanner internal error--end of buffer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55889324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com