【问题标题】:Segmentation fault caused by sem_getvalue()sem_getvalue() 导致的分段错误
【发布时间】:2017-03-23 21:01:49
【问题描述】:

我正在使用 中包含的信号量在 C 中编写一小段代码,但我无法继续,因为在 sem_getvalue 行上我总是遇到分段错误。有人可以解释我为什么吗?谢谢

编辑:我用 gcc -lpthread -lrt -l c 编译

#include <semaphore.h>
#include <stdlib.h>

#define N 3
#define FILENAME "resource.txt"
#define SEM_PROC "/semname"

int main(){
    FILE* f = fopen(FILENAME, "w");
    sem_t* proc_semaphore = sem_open(SEM_PROC, O_CREAT, "0777", 0);
    if (proc_semaphore == SEM_FAILED) {
        printf("[FATAL ERROR] Could not open the named semaphore\n");
        exit(1);
    }
    printf("Sem created\n");
    int* current= malloc(sizeof(int)); *current = -N;
    sem_getvalue(proc_semaphore, current);
    printf("current value: %d\n:", *current);

【问题讨论】:

  • 不要转换 malloc 的结果
  • "0777" 肯定是错误的(删除引号),但这不应该导致崩溃。而且您没有包含 stdlib.h,如果您没有转换 malloc 的结果(不要转换 malloc 的结果),编译器会抱怨它,但如果这将是一个问题,它应该有导致*current = -N 行崩溃,而不是sem_getvalue。而且您没有检查sem_open 是否成功。这可能是最重要的错误。
  • 好的,谢谢,我意识到错误出现在 sem_open 函数中。但是现在我不明白为什么 sem_open 总是失败。
  • (我也不明白你为什么不直接使用int current = -3; sem_getvalue(proc_semaphore, &amp;current);
  • 当 sem_open 失败时,您是否打印出strerror(errno)?当系统调用失败时,您应该始终这样做。

标签: c process synchronization semaphore


【解决方案1】:

很难确定到底出了什么问题,但我试试看。

  • 如果此函数由于某种原因无法为您分配内存,

    malloc 可以返回 NULL。这可能会导致 SEGFAULT。我建议用简单的 int 变量替换你的 int *:

    int current = -N;
    sem_getvalue(sem,&current);
    
  • 我建议使用 perror() 函数而不是 printf 作为错误句柄,因为它会打印带有错误详细信息的人类可读消息:

    sem_t* proc_semaphore = sem_open(SEM_PROC, O_CREAT, "0777", 0);
    if (proc_semaphore == SEM_FAILED) {
        perror("ERROR:");// e.g. "ERROR: Permission denied" or similar
        exit(1);
    }
    
  • 您将 SEM_PROC 定义为 "/semname,这会在为我创建信号量时导致“权限被拒绝”错误。您应该定义普通用户可以使用的名称 (例如“semname”)。

【讨论】:

  • 您的其他建议是合理的,但sem_open("/foo") 没有在根目录中创建文件,即使它看起来很像。如果您使用带有前导斜杠(并且没有内部斜杠)的名称,它实际上具有未指定的行为。我不知道您为什么会收到“权限被拒绝”。
猜你喜欢
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 2011-11-06
  • 2020-12-31
  • 2019-07-21
  • 2018-07-28
  • 2014-04-25
  • 2011-07-18
相关资源
最近更新 更多