进程间通信-信号

来源:互联网 发布:mac战网怎么更改地区 编辑:程序博客网 时间:2024/03/29 12:57

信号分为5:

l  硬件情况

l  软件情况

l  输入输出通知

l  进程控制

l  资源控制

用户进程对信号的响应形式

l  忽略信号,除SIGKILLSIGSTOP

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;
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 香皂堵在蹲便里怎么办 墙里管道渗水怎么办 浴缸下水管漏水怎么办 冷水空调出水管漏水怎么办 浴缸塞子堵住了怎么办 热水管破裂了怎么办 厨房热水管漏水怎么办 水管热接漏水怎么办 陶瓷浴缸下水漏水怎么办 热溶水管漏水怎么办 浴缸下水口漏水怎么办 浴缸下水器漏水怎么办 铁皮接头处漏水怎么办 马桶被堵死了怎么办 家里灯泡坏了怎么办 家里电路烧了怎么办 如果电脑开不了怎么办 热水器水管子漏水怎么办 淋浴头开关滴水怎么办 淋浴头一直滴水怎么办 饮水机放桶漏水怎么办 热水器热水阀门漏水怎么办 热水器热水出口漏水怎么办 热水器上水管漏水怎么办 水管往外漏水怎么办 ppr热水管漏水怎么办 大半夜水闸爆了怎么办 热水器不热水了怎么办 水龙头外皮裂了怎么办 电热水龙头坏了怎么办 太阳能存不住水怎么办 混水阀断裂漏水怎么办 洗澡淋浴头漏水怎么办 马桶有异物堵住怎么办 捷达机油盖漏油怎么办 乳化油臭了怎么办 自行车前叉严重生锈怎么办 自行车链条生锈了怎么办 自行车链子生锈了怎么办 对切削液过敏怎么办 齿轮油加到机油怎么办