使用信号量semop Numerical result out of range && Resource temporarily unavailable 问题
2013-11-19 10:40
465 查看
最近在移植和测试syslogd代码时,碰到两个问题:Resource temporarily unavailable(EAGAIN)和 Numerical result out of range。
移植的时候,在初始化全局变量的时候,有sembuf的初始化。如下图
struct sembuf SMwup[1] = = { {1, -1, IPC_NOWAIT} }; //此部分对应V操作
struct sembuf SMwdn[3] == { {0, 0}, {1, 0}, {1, +1} };//此部分对应P操作。
开始看到这部分代码,发现V操作的sem_flag设置为IPC_NOWAIT。我就想当然的设置将P操作初始化为如下:
struct sembuf SMwdn[3] == { {0, 0,IPC_NOWAIT}, {1, 0,IPC_NOWAIT}, {1, +1,IPC_NOWAIT} };
结果在测试的过程中发现,程序运行一段时间,当有很多进程同时写syslogd时,syslogd就报如下的问题。
在网上查看的过程中发现,sem_flag还有一个SEM_UNDO标志,使用此标志,当进程退出时,系统会负责回收信号量资源。我考虑到syslogd进程需要重启,就设置了此标志。此时的sembuf初始化如下:
struct sembuf SMwdn[3] == { {0, 0,SEM_UNDO}, {1, 0,SEM_UNDO}, {1, +1,SEM_UNDO} };
修改后初步测试几把,没有出现此问题。以为修改成功。但是在后续的测试过程中,出现了如下的问题。
struct sembuf SMwup[1] = = { {1, -1, IPC_NOWAIT|SEM_UNDO} }; //此部分对应V操作
struct sembuf SMwdn[3] == { {0, 0}, {1, 0}, {1, +1,SEM_UNDO} };//此部分对应P操作
修改后反复测试代码,设置不同的日志等级测试均没有出现上面的问题。
移植的时候,在初始化全局变量的时候,有sembuf的初始化。如下图
struct sembuf SMwup[1] = = { {1, -1, IPC_NOWAIT} }; //此部分对应V操作
struct sembuf SMwdn[3] == { {0, 0}, {1, 0}, {1, +1} };//此部分对应P操作。
开始看到这部分代码,发现V操作的sem_flag设置为IPC_NOWAIT。我就想当然的设置将P操作初始化为如下:
struct sembuf SMwdn[3] == { {0, 0,IPC_NOWAIT}, {1, 0,IPC_NOWAIT}, {1, +1,IPC_NOWAIT} };
结果在测试的过程中发现,程序运行一段时间,当有很多进程同时写syslogd时,syslogd就报如下的问题。
1、Resource temporarily unavailable(EAGAIN)问题。
从网上查看semop函数使用发现,当执行P操作时,如果对应的sem_flag设置为IPC_NOWAIT时,就会很容易出现此问题,原因是当多个进程同时写syslogd时,如果已经有进程写syslogd,此时此进程就占用了信号量,其他进程再来对此信号量执行P操作时,由于设置了IPC_NOWAIT,后进入的进程不会等待,只会立即返回,同时报Resource temporarily unavailable(EAGAIN)错误。在网上查看的过程中发现,sem_flag还有一个SEM_UNDO标志,使用此标志,当进程退出时,系统会负责回收信号量资源。我考虑到syslogd进程需要重启,就设置了此标志。此时的sembuf初始化如下:
struct sembuf SMwdn[3] == { {0, 0,SEM_UNDO}, {1, 0,SEM_UNDO}, {1, +1,SEM_UNDO} };
修改后初步测试几把,没有出现此问题。以为修改成功。但是在后续的测试过程中,出现了如下的问题。
2、Numerical result out of range
从网上查找相同的问题,发现也有人遇到此问题。有的人是说不设置sem_flag,使用默认的0值。回想发现,syslogd原始代码就是这样的。另外也有人说设置sem_flag时,P和V操作都需要设置SEM_UNDO。考虑需要系统恢复信号量,使用第二种方式。此时P和V操作对应的sembuf设置如下:struct sembuf SMwup[1] = = { {1, -1, IPC_NOWAIT|SEM_UNDO} }; //此部分对应V操作
struct sembuf SMwdn[3] == { {0, 0}, {1, 0}, {1, +1,SEM_UNDO} };//此部分对应P操作
修改后反复测试代码,设置不同的日志等级测试均没有出现上面的问题。
相关文章推荐
- .NET中使用GridView控件输入数据时出现“ Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index"的问题
- 海思mmz: section 2 reloc 30 sym 'printk': relocation 28 out of range问题解决
- 遇到的一个"String index out of range" 问题
- 使用mybatis执行sql的时候为什么会出现Parameter index out of range (1 > number of parameters, which is 0)?
- 在Linux环境上面,su切换到oracle时出现"-bash:fork:Resource temporarily unavailable"问题
- 使用mybatis执行sql的时候为什么会出现Parameter index out of range (1 > number of parameters, which is 0)?
- BIRT出现java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0)的问题
- 使用mybatis执行sql的时候为什么会出现Parameter index out of range (1 > number of parameters, which is 0)?
- 容器赋值 容器使用问题:vector subscript out of range
- 使用PCL的IntegralImageNormalEstimation遇到的vector subsript out of range问题
- MySQL使用like出现 操作MySQL数据库报出:Parameter index out of range (1 > number of parameters
- Bitmap内存优化--使用BitmapFactory.options及SoftReference解决OutOfMemory问题
- 将int字段改为decimal类型后出现1264 Out of range value的问题分析和处理之二
- wildfly使用--java.lang.OutOfMemoryError报错问题的解决
- 解决eclipse中出现Resource is out of sync with the file system问题
- MATLAB "Out of memory"问题(转载)
- 文件系统不同步问题resource is out of sync with the file system的解决办法
- Samba & Nginx - Resource temporarily unavailable
- 解决eclipse中出现Resource is out of sync with the file system问题
- VC debug状态下"one or more files are out of date"的问题