gpt4 book ai didi

c - 如何阻止 ENOSYS 的 sem_open() 失败?

转载 作者:可可西里 更新时间:2023-11-01 11:44:59 27 4
gpt4 key购买 nike

我有两个 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 */

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);
}
}

最佳答案

/dev/shm 挂载了吗?旧版本的 slackware 可能没有在启动时挂载这个文件系统。来自/etc/fstab:

tmpfs  /dev/shm  tmpfs  defaults  0   0

编辑:毕竟这可能不是问题所在。我认为您可能只需要升级您的内核甚至 librt。

Edit2:我认为对于我认为你正在使用的 slackware 11,你需要一个比 2.6.13 更新的内核来使用 NPTL 线程库(/lib/tls 中的库),这似乎是sem_open 开始工作。

Edit3:我通过 a) 安装/dev/shm 和 b) 将环境变量 LD_ASSUME_KERNEL 设置为 2.6.13(任何内核版本),设法让它与我拥有的 slackware 11 box 一起工作> 2.6.12 将工作)。即使内核是 2.6.11.11,这似乎也能工作,但线程等其他东西可能不会。

关于c - 如何阻止 ENOSYS 的 sem_open() 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/270113/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com