首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sem_wait的Coredump

sem_wait的Coredump
EN

Stack Overflow用户
提问于 2013-12-10 06:12:45
回答 3查看 4.5K关注 0票数 1

我在这里有一个相当奇怪的问题,或者我不知道它的工作方式,但不管怎么说,下面的程序都能正确地创建信号量,并第一次运行到最后。但是如果信号量已经存在的话,SEGFaults在sem_wait。我在64位Fedora 17上运行这个程序。这有必要对错误做些什么吗?

代码语言:javascript
复制
#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

代码语言:javascript
复制
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?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-10 06:19:45

如果sem_open失败,它将返回SEM_FAILED,在我的系统上(可能还有其他人),这相当于NULL。对照一下,而不是-1

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

票数 5
EN

Stack Overflow用户

发布于 2013-12-10 06:51:43

分割错误通常发生在对CPU无法物理寻址的特定内存进行尝试时。硬件将内存冲突通知操作系统,内核( OS )响应发送纠正措施,通常会终止它或导致转储核。切分最常见的原因是取消引用空指针。试一试也许会有帮助。

票数 1
EN

Stack Overflow用户

发布于 2018-11-27 02:56:42

检查man open_sem:

“如果O_CREAT和O_EXCL都是在oflag中指定的,那么如果具有给定名称的信号量已经存在,则返回一个错误。”

看来你的信号量已经存在了。这就是为什么您的代码在从/dev/shm中移除后再次工作-因此它可以再次创建它w/o错误。

我不知道为什么当man说SEM_FAILED时,每个人都在检查-1返回值是否有错误。可能以前表现得很开放。SEM_FAILED可以定义为任何内容,您不应该假设它的值并使用宏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20487432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档