2013-12-10 18 views
0

我在這裏有一個相當奇怪的問題,或者我不知道它的工作方式,但任何方式我有下面的程序正確創建信號量並運行到第一次結束。但是,如果信號量已經存在,則在sem_wait處發生SEGFault。 我正在64位Fedora 17上運行此操作。是否必須對錯誤執行任何操作?在sem_wait Coredump

#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/shm的 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/shm的或取消註釋sem_unlink旗語它屢試不爽。我在這裏做錯了什麼或者是否需要在某處運行sem_post?

謝謝。

回答

4

如果sem_open失敗,則返回SEM_FAILED,它在我的系統(可能是其他人)上相當於NULL。檢查而不是-1

此外,如果失敗,則會打印實際錯誤(例如,使用perror()strerror())。

1

當試圖對CPU無法物理尋址的特定內存時,通常會發生分段錯誤。硬件通知操作系統內存違規,作爲響應的內核(OS)發送糾正措施,通常終止它或導致轉儲核心。分割最常見的原因是取消引用NULL指針。嘗試一下可能會有所幫助。

+0

在我的情況下,有一件事我可能會誤解。這些64位指針值是否相同? 0x7f0d0b8c0000和0xb8c1000。我在這裏遇到了一個核心轉儲 – user1663533

+0

我認爲代碼與32位或64位指針值一樣可以編寫,編譯和執行。大多數問題出現在/如果你做某些事情時,例如假設操作系統類型相似(例如,DWORD將保存一個指針 - 在32位代碼中爲true,而在64位代碼中爲true)。 – user3007735