信号相关的程序
1、不断打印*换行之后响应信号,然后循环
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
static void alrm_handler(int signo)
{write(1,"!",1);
}int main( int argc, char** argv)
{sigset_t set,oset,saveset;signal(SIGINT,alrm_handler);sigemptyset(&set);sigaddset(&set,SIGINT);sigprocmask(SIG_UNBLOCK,&set,&saveset);for( int j = 0 ; j < 100; j++){sigprocmask(SIG_BLOCK,&set,&oset);for( int i = 0; i <5;i++){sleep(1);write(1,"*",1);}write(1,"\n",1);sigprocmask(SIG_SETMASK,&Oset,NULL); }sigprocmask(SIG_SETMASK,&saveset,NULL);exit(0);
}
2、打印一行* 等待信号,信号来了才开始打印,然后重复,使用的是标准信号
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
static void alrm_handler(int signo)
{write(1,"!",1);
}int main( int argc, char** argv)
{sigset_t set,oset,saveset;signal(SIGINT,alrm_handler);sigemptyset(&set);sigaddset(&set,SIGINT);sigprocmask(SIG_UNBLOCK,&set,&saveset);sigprocmask(SIG_BLOCK,&set,&oset);for( int j = 0 ; j < 100; j++){for( int i = 0; i <5;i++){sleep(1);write(1,"*",1);}write(1,"\n",1);sigsuspend(&oset); /*sigset_t tmpset;sigprocmask(SIG_UNBLOCK,&set,&tmpset);pause();sigprocmask(SIG_SETMASK,&tmpset,NULL);*/}sigprocmask(SIG_SETMASK,&saveset,NULL);exit(0);
}
2、打印一行* 等待信号,信号来了才开始打印,然后重复,使用实时信号
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#define MYRTSIG (SIGRTMIN+6)
static void mysig_handler(int signo)
{write(1,"!",1);
}int main( int argc, char** argv)
{sigset_t set,oset,saveset;signal(MYRTSIG,mysig_handler);sigemptyset(&set);sigaddset(&set,MYRTSIG);sigprocmask(SIG_UNBLOCK,&set,&saveset);sigprocmask(SIG_BLOCK,&set,&oset);for( int j = 0 ; j < 100; j++){for( int i = 0; i <5;i++){sleep(1);write(1,"*",1);}write(1,"\n",1);sigsuspend(&oset);}sigprocmask(SIG_SETMASK,&saveset,NULL);exit(0);
}
实时信号不丢失,会排队。
使用ulimit -a 查看pending signals 字段 显示实时信号最大的排队数量