alarm函数
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
功能:在seconds秒后,向调用进程发送一个SIGALRM信号,SIGALRM信号的默认动作是终止调用alarm函数的进程
返回值:若以前没有设置过定时器,或设置的定时器已超时,返回0;否则返回定时器剩余的秒数,并重新设定定时器
//pause函数案例#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<signal.h>intmain(int argc,charconst*argv[]){
pid_t pid;
pid =fork();if(pid <0){printf("fail to fork\n");}elseif(pid >0)//父进程{printf("parent process execute\n");pause();}else//子进程{printf("child process execute and sleep for 3sec \n");sleep(3);kill(getppid(), SIGINT);}return0;}
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<signal.h>voidhandler(int sig){if(sig == SIGQUIT){printf("SIGQUIT 信号处理函数执行\n");}if(sig == SIGTSTP){printf("SIGTSTP 信号处理函数执行\n");}}intmain(int argc,charconst*argv[]){int cnt =0;#if 0//以默认方式处理信号if(signal(SIGQUIT, SIG_DFL)== SIG_ERR){perror("fail to signal to SIGQUIT\n");exit(1);}if(signal(SIGTSTP, SIG_DFL)== SIG_ERR){perror("fail to signal to SIGTSTP\n");exit(1);}#endif#if 0//以忽略方式处理信号if(signal(SIGQUIT, SIG_IGN)== SIG_ERR){perror("fail to signal\n");exit(1);}if(signal(SIGTSTP, SIG_IGN)== SIG_ERR){perror("fail to signal\n");exit(1);}#endif#if 1//以自定义方式处理信号,注意传参不要传SIGKILL、SIGSTOPif(signal(SIGQUIT, handler)== SIG_ERR){perror("fail to signal\n");exit(1);}if(signal(SIGTSTP, handler)== SIG_ERR){perror("fail to signal\n");exit(1);}#endifwhile(1){
cnt++;printf("cnt = %d\n", cnt);sleep(1);}return0;}
#include<stdio.h>#include<signal.h>intmain(int argc,charconst*argv[]){//__sigset_t set;
sigset_t set;int ret =0;//初始化一个空的信号集//__sigemptyset(&set);sigemptyset(&set);//判断SIGINT是否在信号集中//ret = __sigismember(&set, SIGINT);
ret =sigismember(&set, SIGINT);if(ret ==0){printf("SIGINT is not a member of set\n");}//将SIGINT/SIGQUIT添加到信号集中//__sigaddset(&set, SIGINT);//__sigaddset(&set, SIGQUIT);sigaddset(&set, SIGINT);sigaddset(&set, SIGQUIT);//再判断一次SIGINT是否在信号集中//ret = __sigismember(&set, SIGINT);
ret =sigismember(&set, SIGINT);if(ret ==1){printf("SIGINT is a member of set\n");}return0;}
#include<stdio.h>#include<signal.h>intmain(int argc,charconst*argv[]){int i =0;
sigset_t sigset;sigemptyset(&sigset);sigaddset(&sigset, SIGINT);while(1){//将set信号集添加到信号阻塞集中sigprocmask(SIG_BLOCK,&sigset,NULL);for(i =0; i <5; i++){printf("SIGINT is blocked\n");sleep(1);}//将set信号集从信号阻塞集中删除sigprocmask(SIG_UNBLOCK,&sigset,NULL);for(i =0; i <5; i++){printf("SIGINT is not blocked\n");sleep(1);}}return0;}