父进程给子进程发送信号 #include<unistd.h> #include<signal.h> #include<sys/types.h> #include<sys/wait.h> #include<stdio.h> main() { pid_t pid; int status; if(!(pid= fork())) { printf("Hi I am child process! "); sleep(10); return; } else{ printf("send signal to child process (%d) ",pid); sleep(1); kill(pid ,SIGABRT); wait(&status); if(WIFSIGNALED(status))//如果子进程因为信号而结束,此宏为真!! { printf("chile process receive signal %d ",WTERMSIG(status));//取得子进程因为信号而终止的信号代码! } } }
#include<unistd.h> #include<signal.h> #include<sys/types.h> #include<sys/wait.h> #include<stdio.h> main() { unsigned int i; alarm(1); for(i=0;1;i++) { printf("I=%d",i); } }
//运行结果部分截图如下
alarm()函数和时间有关系,这个函数可以在second秒后向自己发送一个SIGALRM信号。
SIGALRM信号的默认操作时结束进程,所以程序在一秒钟以后结束!
#include<unistd.h> #include<signal.h> #include<sys/types.h> #include<sys/wait.h> #include<stdio.h> #include<stdlib.h> 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 "); for(i= 0; i<5; i++){ sleep(1); // fprintf(stderr,"Blocked calculation is finished "); } /**/ sigprocmask(SIG_UNBLOCK,&intmask,NULL); fprintf(stderr,"SIGINT signal unblocked "); for(i=0; i<100; i++){ fprintf(stderr,"Unblocked calculation is finished "); } exit(0); } }
当我按下ctrl+c时,因为信号被阻塞,所以程序继续执行,等到解除阻塞时,程序停止执行!
#include <stdio.h> #include <signal.h> typedef void (*signal_handler)(int); void signal_handler_fun(int signal_num) {
printf("catch siganl %d ",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 + 打印结果为最后一行。*/