У меня есть две системы Slackware Linux, в которых сбой вызова семафора POSIX sem_open()
с ошибкой, равной 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
имеет значение true, а 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);
}
}