我正在尝试使用命名信号量在我的linux应用程序中的多个进程之间进行同步。
#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
int main( )
{
int sval = -2;
char sem_open_file[128];
snprintf(sem_open_file, 128, "/MyNamedSem");
sem_t *sem = sem_open((const char *)sem_open_file, O_CREAT|O_EXCL, S_IRWXU|S_IRWXG|S_IRWXO, 0);
if(SEM_FAILED == sem)
{
printf( "sem_open failed with errno %d\n",errno);
}
else
{
printf("sem_open succeded\n");
}
return 0;
}
我的示例代码在我的Ubuntu机器上运行正常。但是当我尝试在嵌入式主板上执行代码的交叉编译版本时,sem_open()失败,错误代码为38(ENOSYS)。
几年前我发现了一个非常相似的question问题并尝试了解决方案,但无法解决我的问题。
从以下命令中我发现libc版本是在内核版本2.6.24上编译的。 (libc是angstrom-2011.03-i686-linux-armv5te-linux-gnueabi-toolchain的一部分。)
$/lib/libc.so.6
GNU C Library stable release version 2.9, by Roland McGrath et al.
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.3.3.
Compiled on a Linux >>2.6.24-23-generic<< system on 2010-04-22.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
Support for some architectures added on, not maintained in glibc core.
BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
但最终应用程序使用的内核版本是2.6.30。
$uname -r
2.6.30
- 内核版本的变化会导致任何问题吗?
我还将linux内核配置为包含POSIX_MQUEUE。
正在使用的NPTL版本是2.9(通过./getconf GNU_LIBPTHREAD_VERSION
在我的嵌入式主板上运行arm-angstrom-linux-gnueabi / usr / bin / getconf获得)
欣赏任何想法以找出问题。谢谢你的帮助。