思考:信号中断函数调用中是否被其他信号中断.
信号函数调用中只屏蔽本身信号,不屏蔽其他信号.(屏蔽了本身信号,信号排队,处理函数处理结束后,立即再次处理该信号调用处理函数。其他信号则直接可以中断处理函数。)
怎么保证信号处理函数调用中屏蔽指定信号呢?
sigaction可以指定处理函数调用的屏蔽信号
sigaction在处理信号的时候,接收数据
sigqueue发送信号的时候,可以发送数据
sigaction/sigqueue是signal/kill的增强版本
函数说明:
使用sigaction/sigqueue有两个理由.
稳定
增强功能
intsigaction(
intsig,//被处理信号
conststruct sigaction*action,//处理函数及其参数
structsigaction*oldact//返回原来的处理函数结构体
)
返回:
0:成功
-1:失败
structsigaction
{
void(*sa_handle)(int);
void(*sa_sigaction)(int,siginfo_t*,void*);
sigset_t*mask;//屏蔽信号
intflags;//SA_SIGINFO(使用第二个函数)
void**//保留成员.
}
例子:
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
voidhandle(int s)
{
printf(“信号处理函数正在处理!\n”);
sleep(5);
printf(“信号处理函数处理结束!\n”);
}
voidmain()
{
structsigaction act={0};
act.sa_handle=handle;
sigemptyset(&act.mask);
sigaddset(&act.mask,SIGINT);//信号处理函数屏蔽SIGINT信号
act.flags=0;
sigaction(SIGUSR1,&act,0);
while(1);
}
说明:
当程序运行,并向程序发送了SIGUER信号,程序调用信号处理函数时,我们按下ctrl+c向程序发送SIGINT信号,处理函数不会中断。(处理函数屏蔽了SIGINT信号),当处理函数结束后,程序会立即处理SIGINT信号。
sigqueue函数:
#include<signal.h>
int sigqueue(pid_t pid,
int sig,
const union sigval value//发送信号时发送的数据);
union sigval {
intsival_int;
void * sival_ptr;
};
例子2:sigqueue发送信号并传递数据
//接收信号:
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void handle(int s,siginfo_t siginfo,void *) //第二个参数是个结构体,该结构体中的成员//si_int存放了传递的int数据,si_ptr 存放了传//递的void*数据.
{
printf(“信号处理函数正在处理!%d\n”,siginfo->si_int);
sleep(5);
printf(“信号处理函数处理结束!\n”);
}
voidmain()
{
structsigaction act={0};
act.sa_sigaction=handle; //要传递数据,要用结构的第二个函数指针
sigemptyset(&act.mask);
sigaddset(&act.mask,SIGINT);//信号处理函数屏蔽SIGINT信号
act.flags=SA_SIGINFO;
sigaction(SIGUER1,&act,0);
while(1);
}
//信号发送
#include<unistd.h>
#include<signal.h>
voidmain()
{
union sigval val;
val.sival_int=9999; //设置传递的数据
sigqueue(pid,SIGUSR1,val);//pid代替上个程序的进程号
}
分享到:
相关推荐
sigaction 函数原型定义如下: int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact) 这个系统调用的作用是改变进程接收到的指定信号的行动。 使用这个函数需要包含头文件#...
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)
sigaction.c 文件下载后直接编译运行,详情看博客
对linux信号机制的详细阐述,包括signal,sigaction等函数的用法,并配以实例,通俗易懂,适合初学者阅读。。。
Linux多线程环境中的信号处理不同于进程的信号处理。一方面线程间信号处理函数的共享性使得信号处理更为复杂,另一方面普通异步信号又可转换为同步方式来简化处理。 本文首先介绍信号处理在进程中和线程间的...
linux 下实现sleep详解及简单实例 sleep: 普通版本 1、基本设计思路: 1>注册SIGALRM信号的处理函数; 2>调用alarm(nsecs)设定闹钟; 3>调⽤pause等待,内核切换到别的进程运行; 4>nsecs秒之后,闹钟超时,内...
Linux系统编程 28. 文件与I/O 1. 汇编程序的Hello world 2. C标准I/O库函数与Unbuffered I/O函数 3. open/close 4. read/write 5. lseek 6. fcntl 7. ioctl 8. mmap 29. 文件系统 1. 引言 2. ext2文件系统 2.1. 总体...
sigaction函数的具体介绍
linux除了支持Unix早期信号语义函数signal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);...
同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些...
该程序是我写的博客“一起talk C栗子吧(v第八十六回:C语言实例--使用信号进行进程间通信三)”的配套程序,共享给大家使用
10.1.3 Linux信号 10.1.4 中断系统调用 10.2 信号函数 10.2.1 signal系统调用 10.2.2 sigaction系统调用 10.3 信号集 10.3.1 信号集函数 10.3.2 进程信号掩码 10.3.3 被挂起的信号 10.4 统一事件源 10.5 ...
很不错的资源pause(让进程暂停直到信号出现) 相关函数 kill,signal,sleep ... 函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号
在Linux中,当阻塞于某个慢系统调用的进程捕获一个信号,则该系统调用就会被中断,转而执行信号处理函数,这就是被中断的系统调用。 然而,当信号处理函数返回时,有可能发生以下的情况: 如果信号处理函数是用...
目录 历史 前言 I. C语言入门 1. 程序的基本概念 1. 程序和编程语言 2. 自然语言和形式语言 ...3. 在Linux C编程中使用Unicode和UTF-8 B. GNU Free Documentation License Version 1.3, 3 November 2008 参考书目 索引
注册信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个进程和该信号被传递给进程时,将执行何种操作。主要有两个函数实现信号的注册:signal()和sigaction()。 2、signal() ...
春*着*信号处理函数 exit_proc 翥安全结束监控的程序 4来没有返回值 告参毒萨响幸帝称昨嗜幸古称索点响卷南都南请南幸难布际本啪昨青市南动南香请非市赤南本 void exit_ proc(int ar InL I struct proc struct proc ...
在Linux系统下,如果使用sigaction将信号SIGCHLD的sa_flags中的SA_NOCLDSTOP选项打开,当子进程停止(STOP作业控制)时, 不产生此信号(即SIGCHLD)。不过,当子进程终止时,仍旧产生此信号(即SIGCHLD)。 3....
**②基于信号和管道的定时事件处理**:建立监听数据集(新连接会加入一个数据集和时间结点,新信息读入会读取数据集并修改时间结点),基于sigaction形式实现对信号和信号处理函数的绑定,信号处理函数向管道发送...
简单分析了linux下system函数的相关内容,具体内容如下 int __libc_system (const char *line) { if (line == NULL) /* Check that we have a command processor available. It might not be available ...