Есть что-то тревожное в semctl()
, работающем при вызове внутри разделяемой библиотеки.Значения, возвращенные для команды IPC_STAT
, неверны.Поля uid , gid и mode .Нет проблем, когда функция вызывается из автономной программы.В таком случае все значения верны.Что важно в моем случае, я точно так же использую семафоры в разделяемой библиотеке и в автономной программе.
Ниже вы можете найти проблемный код:
static int sem_check( int semid ) {
union semun semdata;
semdata.buf = (struct semid_ds*)malloc( sizeof(struct semid_ds) );
memset( semdata.buf, 0, sizeof(struct semid_ds) );
int rc = semctl( semid, 0, IPC_STAT, semdata );
if( rc==0 ) {
if( semdata.buf->sem_perm.uid==0 && semdata.buf->sem_perm.gid==999 && semdata.buf->sem_perm.mode==0660 ) {
printf("semaphore OK");
} else {
printf( "semaphore BAD: uid: %hd, gid: %hd, mode: %ho", semdata.buf->sem_perm.uid, semdata.buf->sem_perm.gid, semdata.buf->sem_perm.mode );
}
}
else {
printf( "semctl() error: %d", rc );
}
return rc;
}
В моемВ этом случае семафор создается с uid = 0, gid = 999 и mode = 0660.Когда я вызываю вышеуказанную функцию из автономной программы, я получаю те же значения (сообщение «Семафор ОК»).Когда я звоню из общей библиотеки, я получаю uid = 0, gid = 0 и mode = 7072 (сообщение «семафор ПЛОХОЙ»).Конечно, в обоих случаях у процесса есть права на чтение для семафора, и здесь не говорится об ошибке semctl()
.
Возможно ли, что я обнаружил ошибку в стандартной библиотеке C?
Моя рабочая среда:
- Linux Debian Wheezy,
- libc v2.13,
- gcc v4.7.2.