2013-12-10 2 views
0

У меня здесь довольно странная проблема, или я не знаю, как это работает, но каким-либо образом у меня есть программа, которая создает семафор правильно и работает до конца в первый раз. Но 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 где-нибудь?

спасибо.

ответ

4

Если sem_open не удалось, он возвращает SEM_FAILED, что в моей системе (и, возможно, все остальные) эквивалентно NULL. Проверьте, что вместо -1.

Кроме того, если это не удается, распечатайте фактическую ошибку (используйте, например, perror() или strerror()).

1

Ошибка сегментации обычно возникает, когда делается попытка сделать конкретную память, к которой физический адрес не может обращаться физическим лицом. Аппаратное обеспечение уведомляет ОС о нарушении памяти, ядро ​​(ОС) в ответ отправляет корректирующее действие против него, обычно заканчивая его или вызывающее ядро ​​дампа. Наиболее распространенной причиной сегментации является разыменование NULL указателей. Это может помочь.

+0

В моем случае есть одна вещь, которую я, возможно, неправильно понял. Значит ли этот 64-разрядный указатель одинаково? 0x7f0d0b8c0000 и 0xb8c1000. Я нахожусь в ядре ядра здесь – user1663533

+0

Я думаю, что код тот же, что и писать, компилировать и выполнять как 32-разрядные, так и 64-битные значения указателя. Большинство проблем возникают, когда/если вы делаете такие вещи, как предполагая сходство между типами ОС (например, что DWORD будет удерживать указатель - true в 32-битном коде, но не в 64-битном коде). – user3007735

Смежные вопросы