0

我像这样编写信号处理程序?

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+\ 时,问题会问您“您确定要退出”吗?如果用户按'y'它将退出,但如果用户按'y'以外的任何其他东西->它将scanf再次卡住,但我需要退出功能并在用户按'n'后返回主程序如何 ?

Breifly:它卡住了,@ getchar()或者scanf()在插入除 'y' 之外的任何字符后再次提示它进行新输入,如果用户插入任何新字符,它会卡住后退出信号处理函数返回到main()

这是新版本的代码:

所以这是最近的代码:

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);
}

如果用户按下“n||N”,仍然会出现同样的问题 getchar() 再次阻塞,直到他再次按下任何 char 并返回 main()。

4

3 回答 3

2

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

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

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

于 2013-03-23T13:13:22.230 回答
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);  
} 
于 2013-03-23T12:58:23.220 回答
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阻塞执行的行为;当程序无法立即使用数据时,它们将等待数据可用并同时阻止执行。您是否考虑过在用户在主线程中输入数据时运行后台线程以继续处理?

于 2013-03-23T13:11:49.370 回答