我有两个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
建议这个errno表示系统不支持sem_open()
。
#define ENOSYS 38 /* Function not implemented */
sem_open()
函数的用户空间在librt
中,我们与之动态链接,在受影响的系统上存在librt
库。受影响的系统声称支持POSIX信号量:
_POSIX_SEMAPHORES
为真,并且sysconf(_SC_SEMAPHORES)
也确认了这一点。谢谢, Kieran
编辑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
$( dirname $0)/a.out
exit
*/
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <semaphore.h>
int main(int argc, char *argv[]) {
const char *SEM_NAME = "SHRMEM_SCXL"; /* name of mutex */
sem_t *mutex = SEM_FAILED; /* ptr to mutex */
#ifdef _POSIX_SEMAPHORES
printf("_POSIX_SEMAPHORES %ld\n", _POSIX_SEMAPHORES);
#else
puts("Undefined");
#endif
printf("sysconf %s\n", sysconf(_SC_SEMAPHORES) ? "Yes" : "No" );
mutex = sem_open(SEM_NAME, O_CREAT, 0666, 1);
if (mutex == SEM_FAILED) printf("Failed %d\n", errno);
else {
puts("Success - pause while you check /dev/shm ");
sleep(5);
sem_close(mutex);
sem_unlink(SEM_NAME);
}
}