Linux系统编程—进程间通信—信号携带消息

sigaction函数

功能:读取和修改与指定信号相关联的处理动作。

函数定义
       #include <signal.h>
       int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

返回值:
成功返回0
出错返回-1。
signal是指定信号的编号。若act指针非空,则根据act修改该信号的处理动作。若oldact指针非空,则通过oact传出该信号原来的处理动作。act和oldact指向sigaction结构体:

           struct sigaction {
               void     (*sa_handler)(int);
               void     (*sa_sigaction)(int, siginfo_t *, void *);
               sigset_t   sa_mask;
               int        sa_flags;
               void     (*sa_restorer)(void);
           };

参数:
前两个参数sa_handler和sa_sigaction都是自定义信号处理函数,同样,sa_handler有两个默认值:SIG_DFL和SIG_IGN。区别在于sa_sigaction是为实时信号而设定的(也支持非实时信号),第二个参数是指向siginfo_t结构的指针,结构中包含信号携带的数据值,第三个参数暂时没有使用(POSIX没有规范使用该指针的标准);
sa_mask是屏蔽信号集;

 siginfo_t {
               int      si_signo;    /* Signal number */
               int      si_errno;    /* An errno value */
               int      si_code;     /* Signal code */
               pid_t    si_pid;      /* Sending process ID */
               uid_t    si_uid;      /* Real user ID of sending process */
               int      si_status;   /* Exit value or signal */
               clock_t  si_utime;    /* User time consumed */
               clock_t  si_stime;    /* System time consumed */
               sigval_t si_value;    /* Signal value */
               int      si_int;      /* POSIX.1b signal */
               void    *si_ptr;      /* POSIX.1b signal */
               void    *si_addr;     /* Memory location which caused fault */

下面代码用si_int,si_value,si_pid来处理信号。

发送端代码

#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

void    handler(int signum, siginfo_t *info, void *context)
{
        printf("get signum=%d\n",signum);
        if(context!=NULL){
                printf("get data=%d\n",info->si_int);
                printf("get data=%d\n",info->si_value.sival_int);
                printf("from:%d\n",info->si_pid);
        }
}

int main()
{
        struct sigaction act;
        printf("pid =%d\n",getpid());

        act.sa_sigaction=handler;
        act.sa_flags=SA_SIGINFO;//be able to get message

        sigaction(SIGUSR1,&act,NULL);
        while(1);
        return 0;
}
接收端代码

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>


int main(int argc,char **argv)
{
        int signum;
        int pid;

        signum=atoi(argv[1]);
        pid=atoi(argv[2]);

        union sigval value;
        value.sival_int=100;

        sigqueue(pid,signum,value);
        printf("%d,done\n",getpid());
        return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是光哥呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值