加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux系统编程之信号(五) 实时信号与sigqueue函数

发布时间:2013-10-15 09:28:09 所属栏目:Linux 来源:站长网
导读:一、sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。 原型:int sigqueue(pid_t pid, int si
一、sigqueue函数

功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。

原型:int sigqueue(pid_t pid, int sig, const union sigval value);

参数:

sigqueue的第一个参数是指定接收信号的进程id,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值。

返回值:成功返回0,失败返回-1

typedef union sigval

{

int sival_int;

void *sival_ptr;

}sigval_t;

sigqueue()比kill()传递了更多的附加信息,但sigqueue()只能向一个进程发送信号,而不能发送信号给一个进程组。

写两个小程序测试一下:

首先是接收信号:

/*************************************************************************
> File Name: process_.c
> Author: Simba
> Mail: dameng34@163.com
> Created Time: Sat 23 Feb 2013 02:34:02 PM CST
************************************************************************/
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<signal.h>
#define ERR_EXIT(m)
do {
perror(m);
exit(EXIT_FAILURE);
} while(0)
void handler(int, siginfo_t *, void *);
int main(int argc, char *argv[])
{
struct sigaction act;
act.sa_sigaction = handler; //sa_sigaction与sa_handler只能取其一
//sa_sigaction多用于实时信号,可以保存信息
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO; // 设置标志位后可以接收其他进程
// 发送的数据,保存在siginfo_t结构体中
if (sigaction(SIGINT, &act, NULL) < 0)
ERR_EXIT("sigaction error");
for (; ;)
pause();
return 0;
}
void handler(int sig, siginfo_t *info, void *ctx)
{
printf("recv a sig=%d data=%d data=%dn",
sig, info->si_value.sival_int, info->si_int);
}

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读