Linux的信号 SIGALRM和SIGINT的使用示例
2015-09-01 15:03
573 查看
对于每一种信号的实用场合,请看上一篇博客:
/article/1885939.html
(1)SIGALRM信号的使用
(2)SIGINT信号的使用示例
/article/1885939.html
(1)SIGALRM信号的使用
[code]#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 参数说明: 第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。 第二个参数handler描述了与信号关联的动作,它可以取以下三种值: (1)一个无返回值的函数地址 此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为signum的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义: void func(int sig); (2)SIG_IGN 这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。 (3)SIG_DFL 这个符号表示恢复系统对信号的默认处理。
[code]#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> void asr(int nSignal) { printf("signal is : %d\n",nSignal); alarm(5); } int main() { int nCount = 0; signal(SIGALRM,asr); alarm(5); while(1) { printf("How are you ,pilot\n"); sleep(1); } }
(2)SIGINT信号的使用示例
[code]int sigemptyset(sigset_t *set); //清空信号集
[code]int sigaddset(sigset_t *set, int signum); //把某一种信号加入到信号集中
[code]int sigdelset(sigset_t *set, int signum); //用来将参数signum代表的信号从参数set信号集里删除。函数执行成功则返回0,如果有错误则返回-1
[code]int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oldset); 一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。sigprocmask()可以用来检测或改变目前的信号屏蔽字,其操作依参数how来决定,如果参数oldset不是NULL指针,那么目前的信号屏蔽字会由此指针返回。如果set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。 参数how的取值不同,带来的操作行为也不同,该参数可选值如下: 1.SIG_BLOCK: 该值代表的功能是将newset所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字。 2.SIG_UNBLOCK:将参数newset所指向的信号集中的信号从当前的信号掩码中移除。 3.SIG_SETMASK:设置当前信号掩码为参数newset所指向的信号集中所包含的信号。 注意事项:sigprocmask()函数只为单线程的进程定义的,在多线程中要使用pthread_sigmask变量,在使用之前需要声明和初始化。
[code]#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> int main() { sigset_t s,p; int i = 0; int count = 0; /* 情况信号集s */ sigemptyset(&s); /* 往信号集中加入 SIGINT*/ sigaddset(&s,SIGINT); /* 把信号集中的信号SIGINT阻塞掉,该进程直接忽视这个信号 */ sigprocmask(SIG_BLOCK,&s,NULL); while(1) { sigpending(&p); if(count++ > 5) sigprocmask(SIG_UNBLOCK,&s,NULL); //解 阻塞 for(i = 1; i < 32; i++) { if(sigismember(&p,i) == 1) { putchar('1'); } else { putchar('0'); } } printf("\n"); sleep(1); } }
相关文章推荐
- Linux下使用MySQL"load data infile"出错的问题
- umask()函数 -- linux函数
- linux常用命令(12):mor命令
- Linux系统的信号详解
- 8-27 linux 学习(权限管理,正则表达式)
- pscp 实现windows linux间互传文件
- Linux命令(用到再更新)
- linux运维实战练习-2015年8月30日课程作业(练习)安排
- Llinux+ROS+OpenCV开发环境配置笔记
- linux -- Ubuntu查看修改mysql的登录名和密码、安装phpmyadmin
- linux中的join、paste、split、tr命令
- Linux命令查看X86平台 ARM平台上可执行文件与库的依赖关系
- fdupes:Linux 中查找并删除重复文件的命令行工具
- 2001528 - Linux: SAP HANA Database SPS 08 revision 80 (or higher) on RHEL 6 or SLES 11
- centOS 源的更新
- centos 安装mysql过程
- 安装Windows和Linux双系统注意事项
- linux非正常关机导致磁盘read-only file system修复
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- Linux下一个简单守护进程的实现 (Daemon)