Linux下的信号学习
参考:http://www.cnblogs.com/taobataoma/archive/2007/08/30/875743.html
有这么一个程序:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <syslog.h> #include <unistd.h> #include <signal.h> #include <sys/time.h>
int sec;
void sigroutine(int signo) {
switch (signo) {
case SIGALRM:
printf("Catch a signal -- SIGALRM ");
break;
case SIGVTALRM:
printf("Catch a signal -- SIGVTALRM ");
break;
}
return;
}
int main() {
struct itimerval value,ovalue,value2;
sec = 5;
printf("process id is %d ",getpid());
signal(SIGALRM, sigroutine);
signal(SIGVTALRM, sigroutine);
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue);
value2.it_value.tv_sec = 0;
value2.it_value.tv_usec = 500000;
value2.it_interval.tv_sec = 0;
value2.it_interval.tv_usec = 500000;
setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
for (;;) ;
}
如果你就这样在UBUNTU11.04里面运行,就会出现这样的情况:没有输出,等三十秒左右才有输出:

然后我做了这样的改动之后就正常了:
void sigroutine(int signo) {
switch (signo) {
case SIGALRM:
printf("\nCatch a signal -- SIGALRM ");
break;
case SIGVTALRM:
printf("\nCatch a signal -- SIGVTALRM ");
break;
}
return;
}

可能是因为输出一个回车符到标准输出消耗了一定的CPU资源,间接的给了系统一个延时。(猜的,求指正~)

浙公网安备 33010602011771号