1.1 代码
-
cong@msi:/work/test/busytest/5sigset_1$ cat ./sigset.c
-
#include "utils.h"
-
#include <signal.h>
-
-
static void catcher(int arg)
-
{
-
dbmsg(); //打印一下
-
//以后每次的SIGALRM就靠这个产生
-
alarm(1); //1s之后再发送一个SIGALRM
-
}
-
-
int main ( int argc, char *argv[] )
-
{
-
struct sigaction sa;
-
memset(&sa, 0, sizeof(sa));
-
sa.sa_flags = SA_RESTART;
-
sa.sa_handler = catcher;
-
sigaction(SIGALRM, &sa,NULL); //设置SIGALRM的处理函数是catcher
-
-
//第1次的SIGALRM就靠这个产生
-
alarm(1); //经过1s钟之后发送一个SIGALAM
-
while(1)
-
{
-
sleep(1);
-
}
-
return EXIT_SUCCESS;
-
}
main主函数中的alarm只运行一次,作为触发SIGALRM的开始
第一次触发SIGALRM后,被catcher捕获,打印并再次调用alarm,循环就产生了。
1.2 运行结果
-
cong@msi:/work/test/busytest/5sigset_1$ ./sigset
-
sigset.c:catcher[6]: //每秒钟打印1次
-
sigset.c:catcher[6]:
-
sigset.c:catcher[6]:
1.3 代码打包
5sigset_1.rar (下载后改名为5sigset_1.tar.gz)
2
想控制信号的处理时,需要用到sigprocmask了
2.1
-
#include "utils.h"
-
#include <signal.h>
-
-
static void catcher(int arg)
-
{
-
dbmsg();
-
alarm(1);
-
}
-
-
int main ( int argc, char *argv[] )
-
{
-
//set sig
-
struct sigaction sa;
-
memset(&sa, 0, sizeof(sa));
-
sa.sa_flags = SA_RESTART;
-
sa.sa_handler = catcher;
-
sigaction(SIGALRM, &sa,NULL);
-
-
alarm(1);
-
while(1)
-
{
-
sigset_t sset, osset;
-
sigemptyset(&sset);
-
sigaddset(&sset, SIGALRM);
-
sigprocmask(SIG_BLOCK, &sset, &osset); //这儿把SIGALM阻塞住了
-
dbmsg();
-
// sigprocmask(SIG_SETMASK, &osset, NULL);
-
sleep(1); //sleep与SIGALRM最好不要同时用,要是有个recvfrom阻塞住就好了
-
}
-
return EXIT_SUCCESS;
-
}
2.2 运行结果
-
cong@msi:/work/test/busytest/5sigset$ ./sigset
-
sigset.c:main[26]:
-
sigset.c:main[26]:
-
sigset.c:main[26]:
-
sigset.c:main[26]:
-
sigset.c:main[26]:
2.3 代码打包
5sigset.rar (下载后改名为5sigset.tar.gz)
2.4 打开开关
-
cong@msi:/work/test/busytest/5sigset$ ./sigset
-
sigset.c:main[26]:
-
sigset.c:catcher[6]:
-
sigset.c:main[26]:
-
sigset.c:catcher[6]:
-
sigset.c:main[26]:
-
sigset.c:catcher[6]:
产生一个SIGALM,先阻塞住,等main中的打印完成再放开SIGALM,进入catcher进行处理
阅读(1379) | 评论(0) | 转发(0) |