Linux下semop等待信号时出现Interrupted System Call错误(EINTR)解决方法

 更新时间:2013年05月27日 15:48:58   作者:  
本篇文章是对在Linux下semop等待信号时出现Interrupted System Call错误(EINTR)的解决方法进行了详细的分析介绍,需要的朋友参考下
错误现象:(semop函数调用,strerror(errno)输出结果)
Interrupted system call
平台:RedHat Linux

LINUX文档关于EINTR的描述是这样子的:
  While blocked in this system call, the process caught a signal.
UNIX文档[IEEE Std 1003.1-2008]关于EINTR的描述是这样子的:
  The semop() function was interrupted by a signal.

这样的两句话如果关从字面上理解的话,就是在semop等待的过程中出现INTR信号。
可是,错误的出现需要解决,错误的原因一般是由程序员写的代码造成的。
经过调试输出定位问题原因,终于找到了问题所有:
当semop正在等待资源时,如果这个时候,该进程中某线程使用system调用SHELL函数时,semop立即返回,并且错误号为EINTR,错误信息如上。别看这样一个小问题,在我的系统中,由于使用了多种手段来实现IPC(进程内通信),要打到原因是由于一个system的调用就不是那么简单了。

[因为网络上这个问题解决方案暂时没有找到,希望能给他人帮助]

该错误我在GOOGLE上搜了一些贴子,有一位仁兄曾说过:由于死锁导致
因为信号量本身就是防止出现死锁。我特意做了一下实验,使用一个互斥变量和一个信号量,以及两个信号量,以不同顺序,以实现死锁,可是系统并未出现我期望的“Interrupted system call”,而只是一味的等待。

今天在看《UNIX网络编程第1卷 套接口API》时,看到了这样的一句话,让我理解了为什么会出现这个错误,原文如下:
“适用于慢系统调用的基本规则是:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。有些内核自动重启某些被中断的系统调用。”
在这里,慢系统调用(slow system call)在书中是指类似accept之类的引起阻塞的函数,而上文讨论过的semop函数,我想应该也是这一类的,所以当现现EINTR信号时,该系统调用被中断,并返回错误,错误号为:EINTR,我们就可以从这个错误号来重新启动我们的系统调用。

相关文章

  • C语言深入讲解函数参数的使用

    C语言深入讲解函数参数的使用

    函数的参数分为形参和实参两种。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用
    2022-04-04
  • C++项目求Fibonacci数列的参考解答

    C++项目求Fibonacci数列的参考解答

    今天小编就为大家分享一篇关于C++项目求Fibonacci数列的参考解答,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C语言实现共享单车管理系统

    C语言实现共享单车管理系统

    这篇文章主要为大家详细介绍了C语言实现共享单车管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • c语言与c++基础知识点(必看)

    c语言与c++基础知识点(必看)

    下面小编就为大家带来一篇c语言与c++基础知识点(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • 基于Qt播放器的实现详解(支持Rgb,YUV格式)

    基于Qt播放器的实现详解(支持Rgb,YUV格式)

    这篇文章主要为大家详细介绍了如何利用Qt实现简易的播放器,可以支持支持Rgb,YUV格式。文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-12-12
  • 通过C语言判断字符串是否为点分十进制的IP地址

    通过C语言判断字符串是否为点分十进制的IP地址

    这篇文章主要为大家详细介绍了如何通过C语言判断字符串是否为点分十进制的IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C语言数据结构之单链表存储详解

    C语言数据结构之单链表存储详解

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。本文将和大家一起聊聊C语言中单链表的存储,感兴趣的可以学习一下
    2022-07-07
  • C++ 线段树原理与实现示例详解

    C++ 线段树原理与实现示例详解

    这篇文章主要为大家介绍了C++ 线段树原理与实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 关于C++11中限定作用域的枚举类型的问题

    关于C++11中限定作用域的枚举类型的问题

    C++中有两种类型的枚举:不限定作用域的枚举类型和限定作用域的枚举类型。限定作用域的枚举类型是C++11标准引入的新类型,对C++11中限定作用域的枚举类型相关知识感兴趣的朋友一起看看吧
    2022-01-01
  • VisualStudio类文件的管理(类文件的分离)的实现

    VisualStudio类文件的管理(类文件的分离)的实现

    在使用 Visual Studio 开发项目的时候,学会进行“类文件的分离”十分重要,本文主要介绍了VisualStudio类文件的管理(类文件的分离)的实现,感兴趣的可以了解一下
    2024-03-03

最新评论