linux sigaction and sigqueue

本文介绍了一个使用C语言实现的父子进程间通过信号进行通信的例子。重点在于如何利用sigqueue函数向子进程发送带有附加数据的信号,并在子进程中通过sigaction注册信号处理函数来接收这些信号数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
/*father process send signal to son*/

//下面这个处理函数只执行了第一行,原因不明
void dd(int a,siginfo_t *t,void *v)
{
   printf("a=%d,signo=%d,sigcode=%d,send pid=%d,value=%s\n",a,
          t->si_signo,t->si_code,
          t->si_pid,(char*)(t->si_ptr));
//   sleep(2);
   printf("receive value from process,the value equal/n");
}
main()
{
  //int r;
  pid_t r;
  r=fork();
  if(r!=0)
  {
   printf("father process\n");
   //father process
   sleep(2);
   union sigval val;
    val.sival_ptr="helloworld";
   sigqueue(r,59,val);
  }else{
   //son process
   printf("son process\n");
   //registe signal deal function
   struct sigaction act={};
   act.sa_flags=SA_SIGINFO;
   act.sa_sigaction=dd;
   sigaction(59,&act,0);
   sleep(5000);
   while(1);
  }
}

在C语言中,`sigaction` 和 `sigqueue` 是两个用于处理信号(signal)的重要功能。通常情况下,操作系统会在捕获到预定义的信号时执行相应的动作,比如终止进程或调用某个信号处理器函数。然而,有时候我们需要模拟信号的丢失,即让信号不会立即被处理,这可以通过以下步骤实现: 1. **使用 sigaction() 替换默认行为**: `sigaction()` 函数用来设置信号的行为,包括替换默认的处理器函数。你可以设置一个新的处理器函数(如果希望手动处理信号),或者设置为SIG_IGN(忽略该信号)或SIG_DFL(恢复默认处理器)。 ```c struct sigaction new_action; memset(&new_action, 0, sizeof(new_action)); // 初始化结构 new_action.sa_handler = SIG_IGN; // 或者设置为忽略 SIG_IGN if (sigaction(SIGUSR1, &new_action, NULL) == -1) { perror("Failed to set signal action"); } ``` 这里我们设置了SIGUSR1信号为忽略,使其暂时不被处理。 2. **使用 sigqueue() 发送信号**: `sigqueue()` 函数可以在进程中发送自定义信号,同时传递额外的数据。即使信号被忽略,数据仍然会被发送。 ```c #include <sys/times.h> // 包含时间戳类型 for sigqueue #define MSG_SIZE 10 char msg[MSG_SIZE] = "Signal message"; // 消息内容 int signum = SIGUSR1; // 如果信号队列失败,返回值将是负数 if (sigqueue(pid, signum, (void*)msg) == -1) { perror("Failed to send signal"); } ``` 这里的 `pid` 是要发送信号的目标进程ID。 3. **模拟信号丢失**: 由于信号被忽略,程序会继续运行,直到你选择在适当的时候恢复处理或检查信号队列中的消息。你可以定期检查 `msg` 变量是否已经被改变,以确认信号是否已到达但未被处理。 请注意,这种方式并不保证信号一定会丢失,因为系统可能会在合适的时间点重新安排处理信号。但是,对于某些应用场景,如测试系统稳定性或进行某种形式的消息传递,这种模拟可能很有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值