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资源,间接的给了系统一个延时。(猜的,求指正~)

 

posted @ 2013-07-25 14:18  yinsua  阅读(289)  评论(0编辑  收藏  举报