www.pudn.com > pthread_examples.rar > sigreceive.c


#include  
#include  
#include  
 
void new_op(int, siginfo_t*, void*); 
 
/* 
 	struct sigaction  
 	{ 
		union 
		{ 
			__sighandler_t _sa_handler; 
			void (*_sa_sigaction)(int, struct siginfo *, void *); 
		}_u 
       	sigset_t sa_mask; 
      	unsigned long sa_flags;  
      	void (*sa_restorer)(void); 
  	} 
 
	typedef struct  
	{ 
		int si_signo; 
		int si_errno;			 
		int si_code;			 
		union sigval si_value;	 
	} siginfo_t; 
  	 
	union sigval  
	{ 
		int sival_int;		 
		void *sival_ptr;	 
	} 
 
 */ 
 
int main(int argc, char**argv) 
{ 
	struct sigaction act;	 
	int sig; 
	sig = atoi(argv[1]); 
	 
	sigemptyset(&act.sa_mask); 
	/*设置了SA_SIGINFO标志,表示信号携带的信息可以传递到信号处理函数中*/ 
	act.sa_flags     = SA_SIGINFO; 
	/*设定了SA_SIGINFO之后,应该为sa_sigaction指定信号处理函数 
	  而不应该为_sa_handler指定信号处理函数*/ 
	act.sa_sigaction = new_op; 
	//act.sa_handler    = new_op; 
	 
	if(sigaction(sig, &act, NULL) < 0) 
	{ 
		printf("install sigal error\n"); 
	} 
	 
	while(1) 
	{ 
		sleep(2); 
		printf("wait for the signal\n"); 
	} 
} 
void new_op(int signum, siginfo_t *info, void *myact) 
{ 
	printf("receive signal %d\n", signum); 
	printf("info->si_signo = %d\n", info->si_signo); 
	printf("info->si_errno = %d\n", info->si_errno); 
	printf("info->si_code = %d\n", info->si_code); 
	printf("info->si_value.sival_int = %d\n", info->si_value.sival_int); 
	sleep(5); 
	printf("new , I am leaving the program ! \n"); 
	exit(0); 
}