获取错误 "fatal flex scanner internal error--end of buffer" 错过,同时处理 CTRL C
Getting ERROR "fatal flex scanner internal error--end of buffer" missed, while handling CTRL+ C
我正在编写一个小的 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
截图如下:
如何正确处理 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;
}
你'brutaly'走出(f)lex(/yacc/bison)代码回来在myShellLoop,所以引入也就不足为奇了不一致
重新定义 YY_INPUT
并且当 control-c 被击中 return 一个特殊字符到 return 一个特殊的 value/token managed在您的解析器中调用 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();
}
我正在编写一个小的 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
截图如下:
如何正确处理 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;
}
你'brutaly'走出(f)lex(/yacc/bison)代码回来在myShellLoop,所以引入也就不足为奇了不一致
重新定义 YY_INPUT
并且当 control-c 被击中 return 一个特殊字符到 return 一个特殊的 value/token managed在您的解析器中调用 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();
}