当前位置: 首页 > 面试题库 >

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

屠浩
2023-03-14
问题内容

我有两个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
html" target="_blank">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,这似乎也可行,但是诸如线程之类的其他东西可能就不行了。



 类似资料:
  • 现象: 运行 php start.php stop 提示 stop fail 原因:几种可能性 第一种可能性: 前提是以debug方式启动的workerman,开发者在终端按了ctrl z给workerman发送了SIGSTOP信号,导致workerman进入后台并挂起(暂停),所以无法响应stop命令(SIGINT信号)。 解决: 在启动workerman的终端输入fg(发送SIGCONT信号)

  • 我在Ubuntu 14.04上安装了redis,而且我似乎几乎每周都有完成RDB快照的问题。Redis版本是3.0.4 64位。 3838:M 24 Feb 09:46:28.826*后台保存成功终止 3838:M 24 Feb 09:47:29.088*在60秒内更改100000次。拯救 3838:M 24 Feb 09:47:29.230*后台保存由pid 17281启动 17281:信号处理

  • 我有一个文件,我需要读取,打印出整数,捕获异常并继续显示下一个整数,依此类推,直到没有更多的整数。 该文件包含:12 5 sd 67 4 cy 我想让它显示: 12 5 输入错误67 4 输入错误 但是,它只给我12,5,接着输入错误,它就停了。我尝试过将所有内容放入while循环中,但它会无休止地循环,并出现输入异常。 我错过了什么,以便循环继续读取下一个int等等?

  • 问题内容: 该程序在九次打印后完成: 如何停止进程(例如eclipse中的Java进程),因为它在9秒的时间限制后没有停止? 问题答案: 您遇到的问题是,取消哔声任务后,调度程序会保留活动线程。 如果存在活动的非守护程序线程,则JVM保持活动状态。 它使该线程保持不变的原因是您已在此行中告诉它这样做: 请注意以下文档: -即使在空闲状态下要保留在池中的线​​程数。 因此,您有两种可能的方法来导致J

  • 问题内容: 我有一个goroutine,它调用一个方法,并在通道上传递返回的值: 如何停止这种goroutine? 问题答案: 编辑: 在意识到您的问题是关于将值发送到goroutine中的chan之前,我匆忙编写了此答案。 下面的方法可以与上面建议的其他chan一起使用,或者利用您已经拥有的chan双向的事实,您可以只使用一个… 如果您的goroutine仅用于处理来自chan的项目,则可以使用

  • 问题内容: 要找出mysqld的启动命令(使用Mac),我可以这样做: 我得到以下输出,这使我可以启动mysql服务器。 我如何找到必要的命令以从命令行停止mysql? 问题答案: 尝试: 要么: 要么: 要么: 如果 在OSX中 安装 Launchctl,则 可以尝试: MacPorts 注意:重新启动后,此设置将持续存在。 家酿 二进制安装程序 我发现在:https : //stackover