父进程给子进程发送信号 #include #include #include #include #include main() { pid_t pid; int status; if(!(pid= fork())) { printf("Hi I am child process!\n"); sleep(10); return; } else{ printf("send signal to child process (%d) \n",pid); sleep(1); kill(pid ,SIGABRT); wait(&status); if(WIFSIGNALED(status))//如果子进程因为信号而结束,此宏为真!! { printf("chile process receive signal %d\n",WTERMSIG(status));//取得子进程因为信号而终止的信号代码! } } }
#include #include #include #include #include main() { unsigned int i; alarm(1); for(i=0;1;i++) { printf("I=%d",i); } } //运行结果部分截图如下 alarm()函数和时间有关系,这个函数可以在second秒后向自己发送一个SIGALRM信号。
SIGALRM信号的默认操作时结束进程,所以程序在一秒钟以后结束!
#include #include #include #include #include #include int main(int argc,char **argv) { double y; int i=0; sigset_t intmask; sigemptyset(&intmask); /* 将信号集合设置为空*/ sigaddset(&intmask,SIGINT); /*加入中断Ctrl+c信号*/ while(1) { /**/ sigprocmask(SIG_BLOCK,&intmask,NULL); //阻塞信号,我们不希望保存原来的集合,所以参数为NULL fprintf(stderr,"SIGINT signal blocked\n"); for(i= 0; i<5; i++){
sleep(1); // fprintf(stderr,"Blocked calculation is finished\n"); } /**/ sigprocmask(SIG_UNBLOCK,&intmask,NULL); fprintf(stderr,"SIGINT signal unblocked\n"); for(i=0; i<100; i++){ fprintf(stderr,"Unblocked calculation is finished\n"); } exit(0); } } 当我按下ctrl+c时,因为信号被阻塞,所以程序继续执行,等到解除阻塞时,程序停止执行!
#include #include typedef void (*signal_handler)(int);void signal_handler_fun(int signal_num){printf("catch siganl %d\n",signal_num);}int main( void ){ signal_handler p_signal=signal_handler_fun; signal(SIGINT,p_signal); for(;;); return 0;}[root@linux leijiangtao]# gcc signal.c[root@linux leijiangtao]# ./a.out^Ccatch siganl 2^Ccatch siganl 2^Ccatch siganl 2/*可以按CTRL +C 来终止该进程了或者CTRL+\此程序是对当我们按下CTRL +C键时,会执行我们定义的信号处理函数。每当我们按下CTRL +C键时会打印该信号的number.可以看出该信号的num为2要想退出可以按下CTRL +\ 打印结果为最后一行。*/