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

错误现象:(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,我们就可以从这个错误号来重新启动我们的系统调用。

时间: 2024-09-15 19:00:38

Linux下semop等待信号时出现Interrupted System Call错误(EINTR)解决方法_C 语言的相关文章

asp.net下ueditor上传大容量视频报http请求错误的解决方法

故障现象: 当使用百度编辑器ueditor上传大容量视频或大容量图片的时候,编辑器报"http请求错误"的解决方法详解: 原因分析: 目前很多CMS整合了百度的ueditor编辑器,但是上传稍微大一点的文件就会报错, 解决方案 1:修改相对应的ueditor\asp\config.json编辑器文件夹中的配置文件config.json在其中查找"videoMaxSize": 1024000000, /* 上传大小限制,单位B,默认1GBB */ 这是我修改后的参数:

C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法_C#教程

本文实例讲述了C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法.分享给大家供大家参考,具体如下: 在Winform中如果将一个透明图片放在窗体上能正常显示透明,但是如果将该图片放在另一个控件上会导致不能显示透明效果. 解决这种情况,可以采取在控件上使用GDI+绘画出透明图片. 这里我们就以一个pictureBox2控件上面重叠一张png透明图片为例: 我们只需要给pictureBox2控件添加Paint事件,然后对png透明图片进行绘制即可,代码如下: private voi

Linux下php-cgi占内存100%电脑变的很卡的解决方法

  Linux系统在使用的时候,电脑变的很卡,发现是php-cgi进程在占用cpu,占用率既然达到了100%,究竟是什么原因导致这种情况的呢?下面小编就给大家介绍下Linux系统php-cgi占用cpu百分百的解决方法. 网站日志目录/home/hosts_log 日志文件有对应的网站id php-cgi日志目录 /usr/local/php_fcgi/logs php-fpm.log slow.log 查看日志文件基本上就可以解决问题了,网站被入侵上传了一个php ddos文件,当然如果不是此

Linux(RHEL4)中ftp的设置暨530错误的解决方法

         在windows上使用ftp命令登录Linux服务器时总是提示:530 Must perform authentication before identifying USER.明明在服务器已经建立了test用户,但是使用该用户登录时,却不能成功,但是从Linux的日志可以看到已经连接上服务器,但是并没有登录成功.解决方法如下:        一.使用vsftpd        1.System Settings→Server Settings →Service,在服务列表中取消

关于Linux下M9 SDK模拟器太大,无法全部显示的解决方法

我在Ubuntu下使用M9 SDK的时候,发现M9的模拟器太大,超过了我的屏幕(1280*800). 没办法看到模拟器全貌,接下来开发就相当不方便了. 这里给出我的解决方案: 由于M9 SDK是android2.3(level 9)的,因此我把Android SDK下android2.3的skins文件夹拷贝覆盖M9 SDK的skins目录. 源目录:/home/snowdream/android-sdk-linux_86/platforms/android-9/skins 目标目录:/home

VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出解决方法_C 语言

换了一台电脑,vc6.0程序中,点击打开文件以及向工程中添加文件时,程序竟然崩溃自动退出了. 不知什么原因,安装相同的vc程序,本本竟然出现此缘故.但是这个操作又是自己经常用到的,所以不得不解决. 与上一台电脑不同的是,此电脑是win7系统,而上一个则是xp系统.此电脑office是2010版本,而上一个则是WPS:于是乎,在网上查资料,来解决. 看到网上也有类似的问题,有的说是win7系统原因,有的说是office2007版本缘故,有的说是viso缘故.总之,这几种说法,我都符合.win7系统

64位系统中IIS7运行ASP时出现ADODB.Connection 800a0e7a错误的解决方法_win服务器

今天将一个ASP网站拷贝到64位的Windows7中运行,IIS7安装都没有问题,可就是死活运行不了,总是出现ADODB.Connection错误"800a0e7a",真是奇怪,之前在XP中运行一点问题都没有的.起初以为是代码上的原因,于是写一段最简单的连接数据库的代码,还是出错,研究半天终于找到了解决方法,拿来分享. 原因是因为在64位Windows7操作系统中,IIS7应用程序池默认没有启用32位应用程序,而我们连接ACCESS数据库的驱动程序Microsoft.Jet.OLEDB

浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法_php技巧

在php.ini文件中将 extension=php_mbstring.dll 移动到 extension=php_exif.dll 之前. 因为 exif 要调用 mbstring, 所以 mbstring 必须在前面. php_exif.dll, EXIF 函数库,需要 php_mbstring.dll. 并且在 php.ini 中, php_exif.dll 必须在 php_mbstring.dll 之后加载. 如若不行,则检查 php.ini 中默认的 extension_dir 值是否

Nodejs下用submit提交表单提示cannot post错误的解决方法_node.js

<span style="font-size:18px;"><form action="/registOK" method="get"> <p>用户名:<input type="text" id="userName" name="userName"></p> <p>密码:<input type="pa