如何停止ENOSYS导致sem_open()失败?

我有两个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(任何内核版本>

2.6.12都可以使用)来使其与slackware 11盒一起使用。即使内核是2.6.1.1.11,这似乎也可行,但是诸如线程之类的其他东西可能就不行了。

以上是 如何停止ENOSYS导致sem_open()失败? 的全部内容, 来源链接: utcz.com/qa/422577.html

回到顶部