问题:Linux 信号处理,当连续给一个进程同时发送多个信号时,部分信号丢失而未得到处理

当连续向一个Linux进程发送多个相同信号时,可能会遇到部分信号丢失的情况。这通常与信号阻塞和处理机制有关。通过使用sigaction函数和信号屏蔽字可以解决这个问题,确保信号的有序处理,避免处理函数的竞态条件。实验表明,sigaction能够排队处理信号,而不会导致信号处理函数的交错执行。
摘要由CSDN通过智能技术生成

参考链接 - linux 信号signal和sigaction理解
(该文章解释了:< 实验 1 中连续多个相同信号处理问题 >,以及 < 实验 2/3 中使用 sigaction 信号屏蔽字解决信号处理函数竞态问题 > )

解释信号丢失问题:
阻塞,sigaction 函数有阻塞的功能,比如 SIGINT 信号来了,进入信号处理函数,默认情况下,在信号处理函数未完成之前,如果又来了一个 SIGINT 信号,其将被阻塞,只有信号处理函数处理完毕,才会对后来的 SIGINT 再进行处理,同时后续无论来多少个 SIGINT,仅处理一个 SIGINT,sigaction 会对后续 SIGINT 进行排队合并处理。
原文:https://blog.csdn.net/beginning1126/article/details/8680757

  1. 连续给一个进程发送多个相同信号时,部分信号丢失而未得到处理(使用 signal 函数处理信号),代码如下:
/* test2.c */
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

// 信号处理函数使用的全局变量
int count_sig = 0;
void handleSig(int);

void main(){
   
    printf("main running...\n");
    signal(SIGINT, handleSig);

	// 循环等待信号的到来
    while(1){
   
        sleep(1);
        printf("alive.\n");
    }
    printf("done.\n");
}

// 信号处理函数
void handleSig(int sig){
   
    sleep(1);
    count_sig ++;
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值