EINTR的捕获处理

Linux中的EINTR和EAGAIN错误码 EINTR和EAGAIN是Linux系统中常见的错误码,它们反映了系统调用的状态和资源可用性。了解这两个错误码的含义和常见场景,可以帮助我们更好地进行进程间通信和同步,以及正确地处理错误和异常情况。 阅读详情

EINTR:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。

信号 SA_RESTART 标志的设置:但不方便于移植,大多数Berkeley的实现从不自动重启select,其中有些实现不重启accept、recvfrom

void sig_handler(int signum)
{
    printf("in handler\n");
    sleep(1);
    printf("return handler\n");
}

struct sigaction action, old_action;

action.sa_handler = sig_handler;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
   
/* 版本1:不设置SA_RESTART属性
/* 版本2:设置SA_RESTART属性 */
//action.sa_flags |= SA_RESTART;

sigaction(SIGINT, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
{
    sigaction(SIGINT, &action, NULL);
}

EINTR

1、对于绝大多数慢速系统调用来说比如:accept、read、write、open等多数可能永远阻塞的系统调用

for ( ; ; )
{
    clilen = sizeof(cliaddr);
    if ( (connfd = accept(listenfd, (SA *)&cliaddr, &clilen)) < 0)
    {
        if (errno == EINTR)
            continue;
        else
            err_sys("accept error");
    }
}

2、connect 被中断之后的处理

 

linux网络编程之慢系统调用被信号中断产生EINTR错误怎么解决总结 1、介绍慢系统调用 该术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就会一直阻塞。 慢系统调用可以被永久阻塞,包括以下几个类别: (1)读写‘慢’设备(包括pipe,终端设备,网络连接等)。读时,数据不存在,需要等待;写时,缓冲区满或其他原因,需要等待。读写磁盘文件一般不会阻塞... 阅读详情

相关推荐

Codesys软运动控制进阶:用SMC_FreeEncoder为ECAT轴搭建一个“虚拟手轮”调试工具

本文详细介绍了如何利用Codesys的SMC_FreeEncoder功能为ECAT轴搭建虚拟手轮调试工具,解决自动化设备开发中的硬件依赖问题。通过软件模拟手轮脉冲信号,实现无硬件依赖的运动控制逻辑验证,显著提升调试效率。适用于汇川AM400等PLC平台,特别适合机械安装滞后或伺服驱动器故障时的调试场景。

weixin_33737774的博客 482

errno!=EINTR是什么意思

如果错误为EINTR表示在读/写的时候出现了中断错误 read()如果读到数据为0,那么就表示文件结束了,如果在读的过程中遇到了中断那么会返回-1,同时置errno为EINTR。 或者是write()如果写的过程中遇到中断就会返回-1 并设置errno为EINTR ...

psq1508690245的博客 6106

告别信息过载:我是如何用Feedly RSS阅读器打造个人专属信息流的(附Chrome插件使用技巧)

本文分享了如何利用Feedly RSS阅读器有效管理信息过载,打造个人专属信息流的方法。通过科学组织订阅源、智能过滤和跨平台同步技巧,帮助用户从被动接收转为主动筛选,提升信息获取效率。特别推荐使用Feedly的Chrome插件和AI过滤功能,实现高效的信息管理。

weixin_42526015的博客 357

socket编程中的EINTR是什么?

socket编程中的EINTR是什么?

小x的博客 1852

EU 2021/646 eCall工程拆解:MSD、测试模式与型式核准

紧急呼叫系统(eCall)是车载通信中面向事故救援的安全功能,其原理是在碰撞或人工触发后,通过蜂窝网络向公共安全应答点发送最小数据集(MSD),并建立语音链路。技术价值在于缩短救援响应时间、提升事故后生存率,应用场景覆盖乘用车、轻型商用车及车载T-Box等前装通信模块。面向欧盟市场时,EU 2021/646把eCall从安装要求推进到型式核准测试,关注触发链路、备用电源、GNSS定位、MSD字段、音频质量与回拨能力。工程落地需要围绕测试模式、字段校验、配置管理和送检样件建立可交付合规方案。

weixin_31815843的博客 210

Understanding Lockup Cells

工具会分析扫描链和EDT逻辑之间的控制时序元素的时钟的时序关系,当必须要同步时钟并保持数据完整性时插入边沿触发寄存器(lockup cells)。可以使用report_edt_lockup_cells命令来展示工具已经插入的lockup cells的详细报告。

weixin_44954910的博客 1082

系统调用中断(EINTR)与SIGCHLD信号的处理

一、被中断的系统调用(EINTR)的理解 1. 慢系统调用是? 2. 慢系统调用的类别 3. EINTR产生的原因 5. 一般处理方法 二、SIGCHLD信号的处理 1. SIGCHLD信号的产生 2. SIGCHLD信号的处理 3. 不处理SIGCHLD的后果 三、示例代码 一、被中断的系统调用(EINTR)的理解 1. 慢系统调用是? 慢...

liushall 2337

反激电源及其变压器计算与绕制

本内容以一个宽电压输入 24V3A 输出的 72W 反激电源为例来计算电路的各个参数和器件选型,包含反激变压器的计算与绕制方法。

让你爱上电路设计 1938

EINTR错误

EINTR错误的产生: 当系统阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致使accept返回一个EINTR错误(被中断的系统调用)。此类慢系统调用包括永远阻塞的系统调用即调用有可能永远无法返回...

weixin_30824479的博客 251

实战:利用 Agent Harness 自动化 PPT 制作

本文将带你从零开始,用轻量级Agent编排框架,结合主流大模型(GPT-4o、通义千问、文心一言等),搭建一套全自动化的PPT生成工作流:从用户输入自然语言需求,到需求解析、大纲生成、内容填充、数据匹配、排版美化、导出成品,全程不需要手动操作,最快10分钟就能产出符合要求的PPT。我们不会讲晦涩的Agent理论,所有步骤都有可直接运行的代码示例,哪怕你只有基础的Python语法基础,也能跟着一步步做出能用的自动PPT工具。

AI Agent Harness Engineering 570

基于STM32姿态解算-正点原子ATK-IMU901模块标准库开发——正点原子串口角度传感器模块十轴IMU加速度气压计陀螺仪_资料编号29

购买了正点原子的ATK-IMU901模块后,发现例程给的是HAL库的,本项目将HAL库例程转换为库函数版本(基于STM32)。实战开发,亲测无误。

嵌入式阿齐Archie 3865

Socket进程处理被中断的系统调用及Accept函数返回EINTR错误处理

我们用慢系统调用来描写叙述那些可能永远阻塞的系统调用(函数调用),如:accept。read等。永远阻塞的系统调用是指调用有可能永远无法返回。多数网络支持函数都属于这一类。比如,假设没有客户连接到server上,则server对accept的调用就没有返回保证。类似的。假设客户从未发送过一行要求server回射的文本。则server对read的调用将永不返回。其它慢系统调用的样例...

adr5970的博客 471

基于STM32LXXX的模数转换芯片ADC(CMS24AD2001)驱动C程序设计

/ 电压 = (原始值 / 2^23) * Vref (注意:24位有符号数范围为 -2^23 到 2^23-1)//---------------- 硬件端口映射 (请根据实际电路修改) ----------------ADC_SCLK_HIGH();- PGA 放大倍数可选:1、2、4、8、16、32、64、128、256;//---------------- 宏定义操作 -------------------//---------------- 函数声明 -------------------

myron6688的博客 161

Socket进程处理被中断的系统调用及Accept函数返回EINTR错误处理 (转)

转自 http://blog.youkuaiyun.com/keshacookie/article/details/40717059?utm_source=tuicool 我们用慢系统调用来描述那些可 能永远堵塞的系统调用(函数调用),如:accept,read等。永远堵塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类。例 如,如果没有客户连接到服务器上,则服务器对acc...

Q848319632的博客 645

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

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

linux网络编程---慢系统调用和中断信号EINTR

我们用慢系统调用来描述那些可能永远堵塞的系统调用(函数调用),如:accept,read等。永远堵塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类。例如,如果没有客户连接到服务器上,则服务器对accept的调用就没有返回保证。类似的,如果客户从未发送过一行要求服务器回射的文本,则服务器对read的调用将永不返回。 当一个进程阻塞在一个慢系统调用函数的时候,捕获到一个信号,等到

chenj_freedom的技术点滴 2068

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

epoll_wait被signal信号中断时的处理

在epoll_wait阻塞期间,signal信号会打断该阻塞,使其返回-1并将errno设置成EINTR,此时可以在主循环中判断并处理该情况,一般continue即可!

Think88666的博客 1377

UNP读书笔记第5章--POSIX信号处理

SIGCHLD信号是由内核在任何一个进程终止时发给它的父进程的一个信号。子进程终止后,会进入僵死状态(zombie),目的是维护子进程的信息(包括子进程的pid,终止状态,资源利用信息等等),直至父进程获取这些信息后,才清理子进程占有的资源。如果一直不读取,子进程就一直处于僵死状态,占有内核空间。(当一个进程终止时,而且其子进程中有僵死的,那么所有僵死的子进程的父进程ID将会设置为1,init进程,清理这些僵死进程的工作交由init进程完成,即init进程wait这些僵死进程)

weixin_43471319的博客 142

linux 等待信号,51CTO博客-专业IT技术博客创作平台-技术成就梦想

错误现象:(semop函数调用,strerror(errno)输出结果)Interrupted system call平台:RedHat LinuxLINUX文档关于EINTR的描述是这样子的:While blocked in this system call, the process caught a signal.UNIX文档[IEEE Std 1003.1-2008]关于EINTR的描述是这...

weixin_30405507的博客 141

网络编程学习_简单的多进程并发服务器/客户端

本文是UNP第五章学习笔记 一,wait和waitpid函数 #include pid_t wait(int* statloc); pid_t waitpid(pid_t pid,int statloc,int options); 这两个函数用来等待子进程结束. 参数statloc返回进程的终止状态,返回值为终止的子进程id waitpid是wait的功能加强版,增加了一些有用的功能,

poppick的专栏 1423

Socket编程中Interrupted system call 解释及解决办法

我们用术语慢系统调用(slow system call)描述accept函数,该术语也适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用有可能永远无法返回,多数网络支持函数都属于这一类。举例来说,如果没有客户连接到服务器上,那么服务器的accept调用就没有返回的保证。类似的,如果客户端从未发送过数据,那么read调用将永不返回。其他慢系统调用的例子是对管道和终端设备的读和...

weixin_33682790的博客 1685

网络编程经验

一 进程相关: (1)当fork子进程时必须捕获SIGCHLD信号,并且SIGCHLD的信号处理程序需正确编写,使用waitpid函数。 (2)当捕获信号时,必须处理被中断的系统调用:当一个进程阻塞在系统调用时捕获某个信号且信号处理程序返回时,该系统调用可能返回一个EINTR错误。有些内核自动重启某些被中断的系统调用。为了便于移植,必须对系统调用返回EINTR做好准备;在套接字中,accept

linux系统、网络编程和分布式计算 761

Linux进程信号处理机制详解与实践指南

进程间通信是操作系统核心机制,其中信号(Signal)作为Linux系统的软件中断机制,广泛用于进程事件通知。其工作原理是通过内核向目标进程发送特定编号的异步事件,触发预设的三种处理方式:系统默认、忽略或自定义处理函数。在系统编程中,信号处理技术对实现优雅退出、定时任务和异常捕获等场景具有关键价值,特别是SIGTERM、SIGSEGV等信号的高效处理能显著提升程序健壮性。通过signal()和更安全的sigaction()函数注册处理逻辑时,需特别注意可重入性和竞态条件问题。现代应用如服务端开发中,结合多线

weixin_30617695的博客 370

慢系统调用

对于那些可能永远阻塞的函数,我们可以称之为慢系统调用,多数网络支持的函数都属于这一类,如上列的这些函数,比如没有客户连接到服务器,那么服务器对与accept的返回没有保证。              应用在这的一个规则是,当一进程阻塞于一个慢系统调用,可能捕获到一个信号,等待信号处理程序返回时,系统调用可能返回一个-EINTR错误。有些内核可能重启系统调用。但是我们便于移植。当我们编写信号处

dongyu_1989的博客 507
上一篇: select的三种用法
下一篇: TCP 简易代码
Turbyun
博客等级 码龄10年 22粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值