Linux进程通信——信号进阶(信号如何携带消息)

信号和信号携带消息异同点

信号相关内容Linux——信号入门

信号处理函数的注册:
入门版:函数signal
高级版:函数sigaction

信号处理发送函数:
入门版:kill
高级版:sigqueue

入门版本的信号注重于动作,而高级版本注重于内容
例如有人敲门,把敲门当作一个信号。入门版只能听见敲门声,而高级版则伴随着敲门和信息。敲门的人可以告诉你他是谁,找你有什么事。

信号接收和发送函数

#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
//signum为信号类型
// const struct sigaction *act为结构体,配置内容
//struct sigaction *oldact 一般当作备份使用
struct sigaction {
   void       (*sa_handler)(int); //信号处理程序,不接受额外数据。这个参数被调用,则和入门版没有区别,只能执行中断函数里的内容,而无法接收数据
   void       (*sa_sigaction)(int, siginfo_t *, void *); //信号处理程序,能够接受额外数据和sigqueue配合使用
   sigset_t   sa_mask;//阻塞关键字的信号集,可以再调用捕捉函数之前,把信号添加到信号阻塞字,信号捕捉函数返回之前恢复为原先的值。一般默认为阻塞,当接收一个信号时,对其它信号不进行处理
   int        sa_flags;//影响信号的行为SA_SIGINFO表示能够接受数据
 };
//回调函数句柄sa_handler、sa_sigaction只能任选其一
//若要接收消息,只需要配第二个和第四个参数
//该函数需要配合sigqueue函数使用
void (*sa_sigaction)(int, siginfo_t *, void *); //信号处理程序,能够接受额外数据和sigqueue配合使用
该函数 siginfo_t 也是一个结构体
内容如下:
siginfo_t {
               int      si_signo;    /* Signal number */
               int      si_errno;    /* An errno value */
               int      si_code;     /* Signal code */
               int      si_trapno;   /* Trap number that caused
                                        hardware-generated signal
                                        (unused on most architectures) */
               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 */
               int      si_overrun;  /* Timer overrun count; POSIX.1b timers */
               int      si_timerid;  /* Timer ID; POSIX.1b timers */
               void    *si_addr;     /* Memory location which caused fault */
               int      si_band;     /* Band event */
               int      si_fd;       /* File descriptor */
}
可以看到高级版信号可以接收很多消息

接收函数

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

void handler(int signum,siginfo_t *info,void *content)
   {
          printf("signum:%d\n",signum);
          printf("content:%d\n",info->si_int);
   }

int main()
{
   struct sigaction act;
   act.sa_sigaction = handler;
   act.sa_flags     = SA_SIGINFO;
   sigaction(SIGUSR1,&act,NULL);
   printf("%d\n",getpid());
   while(1);
   return 0;
}

接收端

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
    int pid;
    int signum;
    pid    = atoi(argv[1]);
    signum = atoi(argv[2]);
    union sigval value;
    value.sival_int = 16;
    sigqueue(pid,signum,value);
    printf("done!\n");
}

在这里插入图片描述
发送成功!
注意:发送字符串只能在 共享内存或者 同一进程下 才可以发送!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pg_hj

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

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

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

打赏作者

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

抵扣说明:

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

余额充值