我有两个 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()
表明系统不支持此 errno 方法。
#define ENOSYS 38 /* Function not implemented */
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
$( 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);
}
}