信号:signal(), sigaction(), sigaddset(), sigemptyset(), sigismember(), sigprocmask()
2012-07-21 00:53
459 查看
实例一:如何使用信号函数捕捉相应的信号,并做相应的处理。
/* * signal.c * * Created on: 2012-7-19 * Author: liwei.cai */ #include <signal.h> #include <stdio.h> #include <stdlib.h> //自定义信号处理函数 void my_func(int sign_no) { if (sign_no == SIGINT) { printf("I have get SIGINT\n"); //Ctrl + C } else if (sign_no == SIGQUIT) { printf("I hava get SIGQUIT\n");//Ctrl + \ } } //int main() //{ // printf("Waiting for signal SIGINT or SIGQUIT..\n"); // //发出相应的信号,并跳到信号处理函数处 // signal(SIGINT,my_func); // signal(SIGQUIT,my_func); // pause(); // exit(0); //} int main() { struct sigaction action; printf("Waiting for signal SIGINT or SIGQUIT>>>\n"); //sigaction结构初始化 action.sa_handler = my_func; sigemptyset(&action.sa_mask); action.sa_flags = 0; //发出相应的信号,并跳转到信号处理函数处 sigaction(SIGINT, &action,0); sigaction(SIGQUIT, &action, 0); pause(); exit(0); }实例二:首先把SIGQUIT、SIGINT两个信号加入信号集,然后将该信号集合设为阻塞状态,并进入用户输入状态。用户只需按任意键,就可以立刻将信号集合设置为非阻塞状态,再对这个信号分别操作,其中SIGQUIT执行默认操作,而SIGINT执行用户自定函数的操作。
/* * sigset.c * * Created on: 2012-7-20 * Author: liwei.cai */ #include <sys/types.h> #include <unistd.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> //自定义的信号处理函数 void my_func(int signum) { printf("IF you want to quit, please try SIGUIT\n"); } int main() { sigset_t set, pendset; struct sigaction action1, action2; //初始化信号集为空 if (sigemptyset(&set) < 0) { perror("sigemptyset"); exit(1); } //将相应的信号加入到信号集 if(sigaddset(&set, SIGQUIT) < 0) { perror("sigaddset"); exit(1); } if(sigaddset(&set, SIGINT) < 0) { perror("sigaddset"); exit(1); } if(sigismember(&set, SIGINT)) { sigemptyset(&action1.sa_mask); action1.sa_handler = my_func; action1.sa_flags = 0; sigaction(SIGINT, &action1, NULL); } if(sigismember(&set, SIGQUIT)) { sigemptyset(&action2.sa_mask); action2.sa_handler = my_func; action2.sa_flags = 0; sigaction(SIGINT, &action2, NULL); } //设置信号集屏蔽字,此时set中的信号不会被传递给进程,暂时进入待处理状态 if (sigprocmask(SIG_BLOCK, &set, NULL) < 0) { perror("sigprocmask"); exit(1); } else { printf("Signal set was blocked, Press any key!"); getchar(); } //在信号屏蔽字中删除set中的信号 if (sigprocmask(SIG_UNBLOCK, &set, NULL) < 0) { perror("sigprocmask"); exit(1); } else { printf("Signal set is in unblock state!"); getchar(); } while(1); exit(0); }
相关文章推荐
- sigemptyset,sigfillset,sigaddset,sigdelset,sigismember,sigprocmask,sigpendmask作用
- sigemptyset、sigaddset、sigprocmask的用法 信号未决,信号阻塞 信号的捕捉
- sigemptyset,sigfillset,sigaddset,sigdelset,sigismember,sigprocmask
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
- 信号相关函数(signal,sigaction,sigprocmask, kill,sigqueue信号发送函数,睡眠函数,计时器函数)
- sigemptyset、sigaddset、sigprocmask的用法
- sigemptyset、sigaddset、sigprocmask的用法
- sigemptyset、sigaddset、sigprocmask的用法
- 嵌入式 sigemptyset、sigaddset、sigprocmask的用法示例
- sigemptyset、sigaddset、sigprocmask的用法
- linux学习---信号(signal,sigaction,kill,sigqueue,sigprocmask,sigpending,sigsuspend)
- Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()
- sigemptyset、sigaddset、sigprocmask的用法
- 信号处理篇alarm ferror kill mkfifo pause pclose perror pipe popen sigaction sigaddset sigdelset sigemptyset signal sleep strerror
- sigemptyset、sigaddset、sigprocmask的用法
- 信号处理篇alarm ferror kill mkfifo pause pclose perror pipe popen sigaction sigaddset sigdelset sigemptyset signal sleep strerror
- sigemptyset、sigaddset、sigprocmask的用法
- Linux信号控制-sigprocmask,sigsuspend,sigpending,sigaction,sigqueue
- 进程的信号掩码【sigprocmask(int what,const sigset_t *set,sigset_t *oldset)】
- sigemptyset sigfillset sigprocmask