我在这里有一个相当奇怪的问题,或者我不知道它的工作方式,但是无论如何,我下面的程序都会以适当的方式正确创建信号量并首次运行到结尾。但是,如果信号灯已存在,则SEGFaults在sem_wait上。我在64位Fedora 17上运行此程序。这是否与错误有关?
#include/* printf() */ #include /* exit(), malloc(), free() */ #include /* key_t, sem_t, pid_t */ #include /* shmat(), IPC_RMID */ #include /* errno, ECHILD */ #include /* sem_open(), sem_destroy(), sem_wait().. */ #include /* 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?
谢谢。