私はこのようなシグナルハンドラをプログラムしますか?
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」を押した後、関数を終了してメインに戻る必要がありますどうやって ?
簡単に言う@ 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);
}
それでも同じ問題 getchar() は、ユーザーが「n | | N」を押すと、再度任意の文字を押して main () に戻るまでブロックします。