寒假学习 第20天 (linux 高级编程) 笔记总结
信号函数调用中只屏蔽本身信号,不屏蔽其他信号
例子:
#include <stdio.h>
#include <signal.h>
void handle(int s)
{
printf("start!\n");
sleep(10);
printf("end\n");
}
int main(int argc, const char *argv[])
{
signal(SIGINT,handle);
while(1);
return 0;
}
sigaction可以指定处理函数调用的屏蔽信号
sigaction在处理信号的时候,可以就是传递数据
sigqueue在发送信号时候,可以发送数据
sigaction / sigqueue 相当于 signal / kill 的增强版本,且这4个函数可以混合使用(例如sigaction发出的信号signal可以处理等)
使用sigaction / sigqueue有两个理由
稳定性
增强功能
int sigaction(int signum, //处理的信号
const struct sigaction *act, //输入的结构体,指定处理函数及其参数
struct sigaction *oldact); //返回原来的处理函数的结构体
void (*sa_restorer)(void); //保留的成员
};
例子:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handle(int s)
{
printf("start!\n");
sleep(10);
printf("end\n");
}
int main(int argc, const char *argv[])
{
printf("pid:%d\n",getpid());
struct sigaction act={0};
act.sa_handler=handle;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask,SIGINT);
act.sa_flags=0;
sigaction(SIGUSR1,&act,0);
while(1);
return 0;
}
信号处理函数中 SIGUSR1与SIGINT都被屏蔽。int sigqueue(pid_t pid, int sig, const union sigval value); //value 传递的信息
union sigval {
int sival_int;
void *sival_ptr;
};
例子1:
#include <stdio.h>
#include <signal.h>
int main(int argc, const char *argv[])
{
union sigval val;
val.sival_int=333;
sigqueue(20899,SIGUSR1,val);
return 0;
}
运行,上上面的代码程序就会收到SIGUSR1的信号
如果把上上面的代码改成下面这样,就可以得到传递的数据
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handle(int s,siginfo_t* info,void *d)
{
printf("start!\n");
printf("info:%d\n",info->si_int);
sleep(10);
printf("end\n");
}
int main(int argc, const char *argv[])
{
printf("pid:%d\n",getpid());
struct sigaction act={0};
act.sa_handler=handle;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask,SIGINT);
act.sa_flags=SA_SIGINFO;
sigaction(SIGUSR1,&act,0);
while(1);
return 0;
}
原文:http://blog.csdn.net/billvsme/article/details/18996223