2 つの 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
この errno は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);
}
}