在sem_wait的Coredump

时间:2013-12-10 06:12:46

标签: c linux synchronization ipc fedora

我在这里有一个相当奇怪的问题,或者我对它的工作方式一无所知,但是我有下面的程序可以正确地创建信号量并且第一次运行到最后。但是,如果信号量已经存在,则sem_wait上的SEGFaults。 我在64位Fedora 17上运行它。这是否必须对错误做任何事情?

#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?

感谢。

3 个答案:

答案 0 :(得分:4)

如果sem_open失败,则返回SEM_FAILED,这在我的系统上(可能是其他所有人)相当于NULL。请检查而不是-1

此外,如果失败,则打印实际错误(例如使用perror()strerror())。

答案 1 :(得分:1)

当尝试CPU无法物理寻址的特定内存时,通常会发生分段错误。硬件通知操作系统有关内存违规的信息,作为响应的内核(OS)会针对它发送纠正措施,通常会终止它或导致转储核心。分段的最常见原因是解除引用NULL指针。尝试这一点可能会有所帮助。

答案 2 :(得分:0)

检查人open_sem:

“如果在oflag中同时指定了O_CREAT和O_EXCL,则如果已经存在具有给定名称的信号灯,则会返回错误。”

您的信号量似乎已经存在。这就是为什么您的代码从/ dev / shm中删除后可以再次工作的原因-因此可以再次创建它而不会出现错误。

当人说SEM_FAILED时,我不确定为什么每个人都在检查-1返回值是否有错误。可能表现得像开放。 SEM_FAILED可以定义为任何东西,您不应假定其值为,而应使用MACRO。