卡在信号处理函数内的fgets的scanf上

时间:2013-03-23 12:54:31

标签: c function signals printf scanf

我是这样编程信号处理程序吗?

sig_quit(int signo)
{
    //char ans[5];
    char ans;

                printf("Are you sure want to exit program ?Y/N \n");
                //while(check){ check = !scanf("%s", ans); }

                //scanf("%c",&ans);
                ans=getchar();
                    //fgets(ans,sizeof(ans),stdin);;
                    printf("ans is : %c",ans);           
                    if(ans=='y' ||  ans=='Y')
                    {                                   
                        printf("Goodbye\n");
                        exit(0);
                        return;
                    }
                    else if(ans!='y')
                    {   

                        printf("why ans is : %c",ans);

                    }   
}

确定默认行为是按ctrl + \ the 问你问你"你确定退出"? 如果用户按下' y它将退出,但如果用户按下除“' y”之外的任何其他内容。 - >它会再次卡在scanf上,但我需要退出该功能并在用户按下' n'怎么样?

Breifly:在插入任何字符后再次卡住@ getchar()scanf(),除了' y' ,为新输入提供它,如果用户插入任何新的char它将卡住它将退出信号处理函数回到main()

以下是新版代码:

所以这是代码recnlty:

volatile sig_atomic_t eflag = 0;
    int main(int argc, char *argv[])
    {

      /*Here are some code  ,,,,,, */

        Signal(SIGQUIT, sig_quit);  /* must call waitpid() */
         while (eflag) 
         {
            /* Main loop program code */

            log_msg(SIGQUIT);
         }



 ////// there is code below...
          .
          .
          .

    }
void log_msg(int signum)
{   
    char ans;
    //signal(SIGQUIT,SIG_IGN);  
            printf("Are you sure want to exit program ?Y/N \n");                        
        do  {
                ans=getchar();
                if(ans=='y' ||  ans=='Y')
                {                                   
                    printf("Goodbye\n");
                    exit(0);
                    return;
                }
                if(ans == 'n' || ans == 'N') return;

            }while(1);          
}


void
sig_quit(int signo)
{
    eflag = 1;
    /* Do some handling specific to SIGINT */
    log_msg(SIGQUIT);
}

,如果用户按下&#34; n || N&#34;再次按下任何字符并返回main(),则getchar()仍然会出现同样的问题。 < / p>

3 个答案:

答案 0 :(得分:2)

根据C标准,在信号处理程序中调用大多数库函数会导致未定义的行为。

实现可以提供额外的支持,但是如果你中断一个已经使用也执行IO的处理程序执行IO的函数,它很可能会导致不可预测的行为。

执行此操作的“正常”方法是让信号处理程序设置一个全局变量,并在main中放置一个测试以检查是否已设置,并采取适当的操作。

答案 1 :(得分:0)

else替换为

if(ans == 'n' || ans == 'N') break;  

修改

我不知道是否存在另一种好方法:

int main(){  
char ans;  
printf('wanna exit?');  
do {  
ans = getchar();  
if(ans == 'y') exit(0);  
if(ans == 'n') break;  
}  
while(1);  
} 

答案 2 :(得分:0)

您希望我们阅读此代码吗?如果是这样,请使其呈现。否则,我们只会想“呃!这是一个阅读的负担。下一个!”......

信号处理程序返回void。函数返回的类型应始终在C中显式声明。由于ans旨在存储getchar()的返回值,它应该是int

void sig_quit(int sig) {
    int answer;
    do {
        puts("Are you sure you want to exit?");
        answer = getchar();
    } while (answer >= 0 && strchr("NnYy", answer) == NULL);

    if (strchr("Yy", answer)) { exit(0); }
}

“卡住”究竟是什么意思?它并不完全清楚,但我认为你指的是scanf和getchar 阻塞执行的行为;当数据不能立即可用于程序时,它们将等待数据变为可用并同时阻止执行。您是否考虑过运行后台线程以在用户在主线程中输入数据时继续处理?