我在這裏有一個相當奇怪的問題,或者我不知道它的工作方式,但任何方式我有下面的程序正確創建信號量並運行到第一次結束。但是,如果信號量已經存在,則在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?
謝謝。
在我的情況下,有一件事我可能會誤解。這些64位指針值是否相同? 0x7f0d0b8c0000和0xb8c1000。我在這裏遇到了一個核心轉儲 – user1663533
我認爲代碼與32位或64位指針值一樣可以編寫,編譯和執行。大多數問題出現在/如果你做某些事情時,例如假設操作系統類型相似(例如,DWORD將保存一個指針 - 在32位代碼中爲true,而在64位代碼中爲true)。 – user3007735