У меня здесь довольно странная проблема, или я не знаю, как это работает, но каким-либо образом у меня есть программа, которая создает семафор правильно и работает до конца в первый раз. Но SEGFaults в sem_wait, если семафор уже существует. Я запускаю это на 64-битной Fedora 17. Нужно ли это делать с ошибкой?Coredump at sem_wait
#include <stdio.h> /* printf() */
#include <stdlib.h> /* exit(), malloc(), free() */
#include <sys/types.h> /* key_t, sem_t, pid_t */
#include <sys/shm.h> /* shmat(), IPC_RMID */
#include <errno.h> /* errno, ECHILD */
#include <semaphore.h> /* sem_open(), sem_destroy(), sem_wait().. */
#include <fcntl.h> /* O_CREAT, O_EXEC */
int
main() {
sem_t *mysem;
int oflag = O_CREAT | O_EXCL;
mode_t mode = 0777;
const char semname[] = "mysem";
unsigned int value = 1;
int sts;
mysem = sem_open(semname, oflag, mode, value);
//sem_unlink(semname);
if(mysem == (void *)-1) {
printf("sem_open() failed");
exit(1);
}
printf("opened a semaphore successful\n");
if(!sem_wait(mysem)) {
/*locked */
printf("worked\n");
} else {
printf("error\n");
}
return 0;
}
Содержание/DEV/ГИМ sem.mysem
Program received signal SIGSEGV, Segmentation fault.
0x000000332980d5f0 in sem_wait() from /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install glibc-2.15-58.fc17.x86_64
(gdb) where
#0 0x000000332980d5f0 in sem_wait() from /lib64/libpthread.so.0
#1 0x000000000040074a in main() at str2.c:31
Странный вопрос в том, что при удалении семафора в/DEV/ШМ или раскомментируйте sem_unlink это работает каждый раз. Я делаю что-то неправильно здесь или мне нужно запустить sem_post где-нибудь?
спасибо.
В моем случае есть одна вещь, которую я, возможно, неправильно понял. Значит ли этот 64-разрядный указатель одинаково? 0x7f0d0b8c0000 и 0xb8c1000. Я нахожусь в ядре ядра здесь – user1663533
Я думаю, что код тот же, что и писать, компилировать и выполнять как 32-разрядные, так и 64-битные значения указателя. Большинство проблем возникают, когда/если вы делаете такие вещи, как предполагая сходство между типами ОС (например, что DWORD будет удерживать указатель - true в 32-битном коде, но не в 64-битном коде). – user3007735