多线程对信号的接受处理

PPT+视频 | 详解智能营销增益模型(uplift model) 分享营销增益模型的原理和常见的建模及评估方法,并以淘票票智能票补为例介绍uplift model技术的实践经验。 阅读详情

最近刚从linux C转做android,老大突然看着我闲,叫我去验证一下“一个进程有多个子线程,子线程都注册监听某个信号,另一个进程向它发送该信号的时候,它会怎么处理?”。

带着这个问题,我搜索了各个贴子之后,大概得出:

进程处理信号,你需要注册signal的一个处理函数,线程你需要用signal_wait去等待一个信号。大体得出,如果一个多线程的进程得到了信号,它是会在它诸多子线程里面选一个来执行,有人说是正在进行的那个线程。在多线程环境下,一般会让其他子线程不处理信号,专门用一个线程来处理信号,把异步变成同步处理。


光看人家的贴子是不行的的。为此,我写了如下代码来验证:

#include <stdio.h>
#include <signal.h>

#include <stddef.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>

static pthread_t g_thread_ids[2]={0};

void ouch1(int sig)
{
    printf("mainthread interrupted,thread id:%u\n",(unsigned int)pthread_self());
    //signal(SIGINT,SIG_DFL);
}
void ouch2(int sig)
{
    printf("child thread 1 interrupted,thread id:%u\n",(unsigned int)pthread_self());
    //signal(SIGINT,SIG_DFL);
}
void ouch3(int sig)
{
    printf("child thread 2 interrupted,thread id:%u\n",(unsigned int)pthread_self());
   //signal(SIGINT,SIG_DFL);
}

void thread_loop1(char* msg)
{ 

    printf("child thread 1 signal now \n");
    signal(SIGINT,ouch2);
    printf("chilid thread1:%d,%s",(int)getpid(),msg);
    while(1);
  
}
void thread_loop2(char* msg)
{
   
    printf("child thread 2 signal now\n");
    signal(SIGINT,ouch3);
    printf("child thread2:%d,%s",(int)getpid(),msg);
    while(1);
  
}
void thread_wait2()
{
    //waiting for thread terminate
    if(g_thread_ids[0]!=0)
    {
        pthread_join(g_thread_ids[0],NULL);
        printf("thread %d terminated\n",getpid());
    }
    if(g_thread_ids[1]!=0)
    {
        pthread_join(g_thread_ids[1],NULL);
        printf("thread %d terminated\n",getpid());
    }
}





//=============test multi-thread test.

void start_test()
{
    pthread_t thread1,thread2;
    char *msg1="this is thread 1\n";
    char *msg2="this is thread 2\n";
    printf("main thread signal now\n");
    signal(SIGINT,ouch1);
    printf("main thread signal now\n");
    pthread_create(&thread1,NULL,(void*)thread_loop1,(void*)msg1);
    g_thread_ids[0]=thread1;
    pthread_create(&thread2,NULL,(void*)thread_loop2,(void*)msg2);
    g_thread_ids[1]=thread2;

    thread_wait2();
    printf("all thread finished its tasks\n");

    return ;

}



int main()
{   
    start_test();
    return 0;
}

上述代码的输出是,谁最后调用signal,谁就会一直处理该信号。

说明,跟正在执行的线程没关系,指定一个之后就会一直由它来处理。如果对一个信号注册了多次,那么最后一次有效,其他的都无效。

mark一下。

超详细MySQL 8.0安装与配置 MySQL的安装与配置 还不会安装MySQL的同学们,还不会配置MySQL的同学们,赶紧按照下面步骤操作起来,超详细安装步骤如下: 进入MySQL官网 1、点击download 2、点击MySQL Community Server 3、选好选项点击go to download page 4、点击download 5、点击no thanks,just start my download 6、选Server only,点击Next 7、点击Execute 8、点击 阅读详情

相关推荐

XianYuAutoDeliveryX:基于闲鱼API与大模型的智能自动发货系统实践

本文详细介绍了如何利用XianYuAutoDeliveryX系统,结合闲鱼API与大语言模型,构建一个智能自动发货解决方案。该系统能实现买家付款后秒级自动发货,并通过对接ChatGPT等大模型智能回复买家咨询,有效解放卖家时间,提升虚拟商品店铺的运营效率和客户体验。

bush的博客 1017

Linux signal, wait, waitpid 函数

信号就是告知某个进程发生了某件事情的通知,有时也称为软件中断,可以由一个进程发给另一个进程,也可以由内核发给进程。一、signal 函数1、定义#include <signal.h> signal(参数1,参数2); /* * 说明: * 参数1位信号名,即我们要处理的信号,在linux中系统信号一共64个,用宏定义表示; * 通过kill -l 可以查看系统所有信号类型; * 其中SIGK

三哥的博客 6026

RK-XCKU5P RoCEv2 传感器桥工程分析报告

烧入后这块 FPGA 就是一个固定身份(CA:FE:C0:FF:EE:00 / 192.168.0.2 / 无 FEC 100G)的RoCEv2 UC 端点,每秒在 UDP 12267 广播自报家门;对端 CX5 只要关 FEC、配 192.168.0.101 +MTU 4200,就能 ping 通它、用 UDP 8192 读写它的全部寄存器、再按"ECB 旁路交换 QPN/rkey"的方式建立 UC RDMA 通道收发数据。

eloudy的专栏 245

Linux系统编程系列之线程的信号处理

Linux系统编程系列之线程的信号处理,信号处理的介绍和使用

AABond的博客 904

fsQCA实战:从数据校准到结果解读的完整流程(附R代码示例)

本文提供了一份完整的模糊集定性比较分析(fsQCA)实战指南,详细阐述了从数据校准、必要条件分析、真值表构建到布尔最小化与结果解读的全流程。通过R语言代码示例,帮助研究者掌握如何将理论转化为可操作的分析步骤,并产出稳健的中间解,以揭示导致结果的复杂条件组合。

d6e7f8g9h的博客 1173

Zabbix在Ubuntu 22.04上的性能优化与监控实战:从基础安装到高级配置

本文详细介绍了在Ubuntu 22.04系统上部署和优化Zabbix监控系统的完整流程,从基础安装到高级配置。内容包括MySQL数据库设置、Zabbix服务器与Web前端优化、性能调优策略以及实战监控场景应用,帮助用户构建高效的企业级监控解决方案。

sss66的博客 895

在多线程程序中指定线程来处理信号

进程中的信号是递送到单个线程的。如果信号与硬件故障或计时器超时相关,该信号就被发送到引起该事件的线程中去,而其他的信号则被发送到任意一个线程。 为了处理简单,可将信号指定某个线程进行处理。 示意代码: #include #include int g_exit = 0; void *thread_signal(void *arg) { printf("thread si

lstok2009的专栏 914

YOLO26改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLO26-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 901

多线程时指定某一个线程处理所有信号

       

weixin_33877092的博客 426

STEP 7-Micro/WIN SMART 编程软件:从入门到精通的使用指南

通过不断实践,熟悉软件的各项功能和操作技巧,工程师可更好地应对工业自动化控制中的各种挑战,开发出高效、稳定的控制程序。项目的基本组件是构成程序的核心元素,包括:程序块(主程序 OB1、子程序和中断程序)、数据块(给 V 存储器赋初值)、系统块(硬件组态和参数设置)、符号表(用符号代替存储器地址,使程序更易理解)以及状态图表(监视、修改和强制变量状态)。下载程序时,单击工具栏上的 “下载” 按钮,在弹出的下载对话框中选择要下载的块(程序块、数据块、系统块),单击 “下载” 即可。

电工 5573

openssl命令数据摘要详解(SM3、sha256、MD5、dss1、mdc2、ripemd160)

SM3是由中国密码学家设计的密码哈希函数,是中国国家密码管理局(National Cryptographic Authority,简称:CNCA)颁布的国家密码算法标准。SM3属于密码杂凑函数家族,它可以计算任意长度的消息并生成固定长度(256比特,即32字节)的哈希值。SM3生成的哈希值长度为256比特(32字节),不管输入消息的长度如何,输出始终是固定的。SM3将输入数据划分为512比特(64字节)的分组,并对每个分组进行处理。

N阶二进制的博客 4460

POSIX 线程 – pthread_sigmask

POSIX 线程 – pthread_sigmask POSIX 线程 – pthread_sigmask POSIX 线程– pthread_sigmask   概念按照 POSIX, 异步 (外部) 信号发送到整个进程. 所有线程共享同一个设置, 即通过 sigaction 设置的线程处置方法. 每个线程有自己的信号掩码, 线程库根据该掩码决定将信号发送到哪个线程. 由于 Linux 线程实现上的独特性, 外部信号始终发送到特定的线程.   pthread_sigmaskpth

1666

泛微OA自定义post接口和路径(无侵入)

泛微OA自定义post接口和路径(无侵入)

技术分享 3870

关于多线程中QT信号槽的异步问题

处理结论 链接参数 参数描述 Qt::AutoConnection 自动处理,缺省参数,在发送端与接收端处于同一线程时,等同于Qt::DirectConnection,否则自动使用Qt::QueuedConnection Qt::DirectConnection 最终处理效果类似于回调函数,槽函数于信号发送者处于同一线程 Qt::QueuedConnection 槽函数不会...

阶乘的闲庭信步 1558

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

QT 事件和信号

仔细来看,事件与信号其实并无多大差别,从我们对其需求上来说,都只要能注册事件或信号响应函数,在事件或信号产生时能够被通知到即可。但有一项区别在于,事件处理函数的返回值是有意义的,我们要根据这个返回值来确定是否还要继续事件的处理,比如在QT中,事件处理函数如果返回true,则这个事件处理已完成,QApplication会接着处理下一个事件,而如果返回false,那么事件分派函数会继续向上寻找下一...

mmdev 188

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

linux signal 处理

  linux signal 处理   说明: 本文主要翻译自ULK 3rd chapter 11. 主要受 http://blog.youkuaiyun.com/yunsongice 影响,故发表在csdn. 另外,本文是最初版本号,预计以后会有一个改进版本号. 文中还有非常多todo的地方. 另外,假设有版权问题,通知我,我立即删掉. ...

weixin_33736048的博客 84

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

多线程并发聊天室简单实现代码详解 -- 涉及网络编程,多线程和线程同步的知识

多线程并发聊天室简单实现和详解

喜欢就关注吧 991

多进程服务器,多线程服务器

/每次一个新的客户端连接上来,开启一条线程,接收 客户端的数据 25 pthread_create(,,routine,&newClientFd);//捕捉 SIGCHLD信号 执行 信号响应函数,在该函数中 回收子进程。//创建一个子进程,子进程负责接收每一个连接上来的客户端数据。//子进程退出的时候 ,会自动发出来一个SIGCHLD信号。while(1){ //接收 客户端的数据。else if(id >0) //父进程。if(id == 0) //子进程{//接收 客户端的数据。

sakura0908的博客 450

多进程服务器和多线程服务器

【代码】多进程服务器和多线程服务器。

Djdbds的博客 1020

Linux十四(Tcp多线程及基于fork的多进程通信)

引入:当一个客户端与服务器建立连接以后,服务器端 accept()返回,进而准备循环接收客户端发过来的数据。如果客户端暂时没发数据,服务端会在 recv()阻塞。此时,其他客户端向服务器发起连接后,由于服务器阻塞了,无法执行 accept()接受连接,也就是其他客户端发送的数据,服务器无法读取。服务器也就无法并发同时处理多个客户端。 这个问题可以通过引入多线程和多进程来解决。服务端接受一个客户端的连接后,创建一个线程或者进程,然后在新创建的线程或进程中循环处理数据。主线程(父进程)只负责监听客户端的连接,并

程序员的规则 1096

多进程多线程并发服务器

8.15

m0_72775937的博客 152

Linux网络编程echo多线程服务器

echo_server服务器多线程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <memory.h> #inc...

273

常用socket函数封装及使用多进程和多线程实现服务器并发

注意:accept或者read函数是阻塞函数, 会被信号打断, 此时不应该视为一个错误。2.防止子进程在信号注册前退出,从而产生僵尸进程。注意:1.循环创建子进程最好循环回收,防止产生僵尸进程。>>> 主进程中对子进程进行回收。

SDTyuan的博客 237

linux下socket小型多线程服务端简单例子,多线程服务端编程

linux下socket小型多线程服务端简单例子,多线程服务端编程

但行技术的博客 293

多进程和多线程实现并发服务器

多进程和多线程实现并发服务器

m0_59039307的博客 144

多进程多线程并发服务器代码

【代码】多进程多线程并发服务器代码。

weixin_44905771的博客 94
上一篇: Asmack开发系列之XMPP基础
下一篇: Asmack开发系列之通信数据流
minimicall
博客等级 码龄18年 407粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值