当前位置:  开发笔记 > 运维 > 正文

如何使用ENOSYS阻止sem_open()失败?

如何解决《如何使用ENOSYS阻止sem_open()失败?》经验,为你挑选了1个好方法。

我有两个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 
#include 
#include 
#include 
#include 


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

Steve Baker.. 5

是/ dev/shm安装?较旧版本的slackware可能没有在启动时挂载此文件系统.来自/ etc/fstab:

tmpfs  /dev/shm  tmpfs  defaults  0   0

编辑:毕竟这可能不是问题.我想你可能只需要升级内核甚至librt.

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

编辑3:我设法通过a)mount/dev/shm和b)将环境变量设置LD_ASSUME_KERNEL为2.6.13(任何内核版本> 2.6.12都可以)来使用Slackware 11盒子.即使内核是2.6.11.11,这似乎也可行,但其他类似线程的东西可能不会.



1> Steve Baker..:

是/ dev/shm安装?较旧版本的slackware可能没有在启动时挂载此文件系统.来自/ etc/fstab:

tmpfs  /dev/shm  tmpfs  defaults  0   0

编辑:毕竟这可能不是问题.我想你可能只需要升级内核甚至librt.

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

编辑3:我设法通过a)mount/dev/shm和b)将环境变量设置LD_ASSUME_KERNEL为2.6.13(任何内核版本> 2.6.12都可以)来使用Slackware 11盒子.即使内核是2.6.11.11,这似乎也可行,但其他类似线程的东西可能不会.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有