进程间通信-信号
来源:互联网 发布:mac战网怎么更改地区 编辑:程序博客网 时间:2024/03/29 12:57
信号分为5类:
l 硬件情况
l 软件情况
l 输入输出通知
l 进程控制
l 资源控制
用户进程对信号的响应形式
l 忽略信号,除SIGKILL、SIGSTOP。
l 捕捉信号,定义信号处理函数,当信号发生则执行相应的处理函数。
l 缺省操作。
(1) 信号处理
#include<signal.h>
typedefvoid (*sighandler_t)(int);
sighandler_tsignal(int signum, sighandler_t handler);
handler:信号处理函数,SIG_IGN(忽略信号)SIG_DFL(默认行为)
返回值为:返回的是之前处理信号的函数指针,或者SIG_ERR
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<signal.h>
void my_alarm_handle(intsign_no)
{
if (sign_no ==SIGALRM) {
printf("I havebeen waken up./n");
}
}
int main()
{
printf("sleepfor 5s ... .../n");
signal(SIGALRM,my_alarm_handle);
alarm(5);
pause();
return 0;
}
(2) 发送信号
int kill(pit_t pid,int signum)//可以给任意进程发送信号
int raise(int signum)//给当前进程发送信号
unsigned int alarm(sec):设置一个进程的超时时钟,c产生益而高SIGALRM信号
int pause(void)//当前进程挂起知道接收到一个信号
(3) 信号集
sigemptyset:初始化信号集合为空
sigfillset:初始化信号集合为所有信号的集合
sigaddset:将指定信号加入到信号集合中去
sigdelset:将指定信号从信号集中删去
sigismember:查询指定信号是否在信号集合之中
sigprocmask:判断检测或更改信号屏蔽字
sigaction:用于改变进程接收到特定信号之后的行为
/*
* 信号集函数组练习
* 数据结构sigaction
* struct sigaction {
* void (*sa_handler)(int signo);
* sigset_t sa_mask;
* int sa_flags;
* void (*sa_restore)(void);
* }
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
/*自定义SIGINT的处理函数,如果你按ctrl+c,则会打印提示,而不是默认的退出*/
void my_func(int sigo_num)
{
printf("If youwant to quit, please try 'ctrl+//' ./n");
}
int main()
{
sigset_t set;
struct sigactionaction1, action2;
/*初始化信号集为空*/
if(sigemptyset(&set) < 0) {
perror("sigemptyset");
exit(1);
}
/*将相应的信号加入信号集*/
if(sigaddset(&set, SIGQUIT) < 0) {
perror("sigaddsetSIGQUIT");
exit(1);
}
if(sigaddset(&set, SIGINT) < 0) {
perror("sigaddsetSIGINT");
exit(1);
}
/*设置信号屏蔽字*/
if(sigprocmask(SIG_BLOCK, &set, NULL) < 0) {
perror("sigprocmaskSIG_BLOCK");
exit(1);
}
else {
printf("blocked,andsleep for 5s .../n");
sleep(5);
}
if(sigprocmask(SIG_UNBLOCK, &set, NULL) < 0) {
perror("sigprocmaskSIG_UNBLOCK");
exit(1);
}
else {
printf("unblock/n");
/*此处可以添加函数功能模块process()*/
sleep(2);
printf("If youwant to quit this program, please try .../n");
}
/*对相应的信号进行循环处理*/
while (1) {
if(sigismember(&set, SIGINT)) {
sigemptyset(&action1.sa_mask);
action1.sa_handler =my_func;
sigaction(SIGINT,&action1, NULL);
}
else if(sigismember(&set, SIGQUIT)) {
sigemptyset(&action2.sa_mask);
/*SIG_DFL采用缺省的方式处理*/
action2.sa_handler =SIG_DFL;
sigaction(SIGTERM,&action2, NULL);
}
}
return 0;
}
- 进程间通信-信号
- 进程间通信--信号
- 进程间通信--信号
- 进程间通信-信号
- 进程间通信---信号
- 【进程间通信】信号
- 进程间通信----信号
- 【进程间通信】信号
- 信号通信(进程间通信)
- 进程间通信之信号
- 进程间通信:信号机制
- 3、进程间通信-信号
- 进程间通信--信号发送
- 父子进程间信号通信
- Linux 进程间通信 信号
- 嵌入式 进程间通信--信号
- 进程间通信______信号
- 进程间通信_04信号
- hiveQL 本地mapreduce
- 基于SaaS的呼叫中心应用思考
- CAN总线的物理接口特性是基于RS485还是RS232?
- WindowsXP上使用FileZilla的 SFTP 功能传输文件
- linux文件权限chmod
- 进程间通信-信号
- 测试团队的绩效考核
- wordpress 的用户登录机制简易分析
- 奇偶数分离
- Android应用程序资源的编译和打包过程分析
- 使用GoogleCode SVN服务
- 内核编译错误的一些解决办法
- opencv例程之哈夫直线变换
- EF 4.3 Code-Based Migrations Walkthrough