日期:2014-05-16  浏览次数:20697 次

求大神分析一段Linux进程的小代码
看第一次输入
 ,感觉定时器已经打破了pause函数造成的挂起状态,然而为啥一下子输出
“Would you want to quit? alarm!alarm!       //①
 Would you want to quit?”
然后五秒后又出现定时信号的处理信息:alarm!alarm!
①处的,那个getchar(),根本没有接受字符啊!! 而且为何那三句是同时出现!!!


#include<stdlib.h>
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<sys/time.h>
void  handle(int signal)
{
switch(signal)
{
   case SIGALRM:
    printf("alarm! alarm! \a\a\a\a\a\a\a\n");break;
    case SIGABRT:
    printf("inabnormally quit!\n");break;
    case SIGINT:
    printf("Catch Signal : %d\n",signal);break;
}
}

int main()
{
printf("Current process ID is: %d\n",getpid());
signal(SIGINT,handle);
signal(SIGALRM,handle);
signal(SIGABRT,handle);
int time=5;
while(1)
{
alarm(time);
printf("would want to quit ?");
if(getchar()=='y') abort();
else pause();
};
return 0;
}
------解决方案--------------------
明确两点:
1.标准输出默认是有缓冲的;
2.信号处理函数要调用异步信号安全函数(Async-signal-safe functions),哪些函数是async-signal-safe的,可参考man 7 singal里的描述。