信号相关的程序
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 字段 显示实时信号最大的排队数量