我有两个Slackware Linux系统,POSIX信号量sem_open()调用失败,errno设置为38.示例代码重现如下(代码在CentOS/RedHat上运行正常).
是否有可能导致此问题的内核或系统配置选项?其他建议?
有问题的系统是Slackware 10.1.0内核2.6.11 /lib/librt-2.3.4.so /lib/libpthread-0.10.so,但相同的代码适用于更旧的RedHat 9内核2.4.20/lib/librt -2.3.2.so /lib/tls/libpthread-0.29.so.(也适用于CentOS 5内核2.6.18 /lib/librt-2.5.so /lib/i686/nosegneg/libpthread-2.5.so).
man sem_open表明sem_open()系统不支持此错误方式.
#define ENOSYS 38 /* Function not implemented */
Run Code Online (Sandbox Code Playgroud)
在sem_open()用户空间是librt我们对动态链接和librt存在受影响的系统.
受影响的系统声称支持POSIX信号量:_POSIX_SEMAPHORES是真的并sysconf(_SC_SEMAPHORES)确认了这一点.
谢谢,基兰
编辑1:我已经在使用的软件版本中添加了更多细节,并删除了一些不相关的评论.
编辑2:/ dev/shm安装在良好的系统上,而不是安装在坏系统上.挂载它不会改变受影响系统上的行为.我认为/ dev/shm也是必要的,但sem_open()在此之前就失败了,strace支持这个.
# /* Quick'n'dirty test program to illustrate sem_open failure
#Run this file to auto-build test and run as a.out
# Build
gcc $0 -lrt
if [ $? -ne 0 ] ; then exit ; fi …Run Code Online (Sandbox Code Playgroud)