【问题标题】:Do you know why this C code ends with "segmentation fault"?你知道为什么这段 C 代码以“分段错误”结尾吗?
【发布时间】:2013-02-03 13:48:05
【问题描述】:

你知道为什么这段 C 代码以“分段错误”结尾吗?

#include <semaphore.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>


#define NAMESEM "/mysem"

int main(int argc, char* argv) {
 sem_t* sem;
 int fd = shm_open(NAMESEM, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, 0);

 ftruncate(fd, sizeof(sem_t));

 sem = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

 sem_init(sem, 1, 0);

 sem_wait(sem);

 return 0;
}

我已关注此处找到的所有与此相关的帖子,但似乎 sem_init() 会产生分段错误,我不知道为什么。我在指针上犯了一些错误吗?

【问题讨论】:

  • 你检查mmap的返回值了吗?
  • 好的,非常感谢!我已经解决了这个福斯特问题。但是现在第二个进程执行 shm_open 时,我收到错误“权限被拒绝”。进程 A 执行 shm_open(NAMESEM, O_RDWR|O_CREAT|O_TRUNC, O_RDWR);而进程 B 执行 shm_open(NAMESEM, O_RDWR, O_RDWR);...是否有权限错误?

标签: c shared-memory semaphore mmap


【解决方案1】:

考虑在这一行中传递给shm_open 的标志:

int fd = shm_open(NAMESEM, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, 0);
                                  ^^^^^^^^^^^^^^

这意味着它将在NAMESEM 不存在时第一次工作。随后的shm_opens 将因为O_EXCL 而失败。这反过来意味着ftruncatemmap 将失败。问题的要点是这些 IPC 对象在程序终止后仍然存在,直到被明确删除或直到系统重新启动。

O_EXCL

如果还指定了O_CREAT,并且共享内存 给定名称的对象已存在,返回错误。

但您的代码中真正的问题是您没有检查这些函数的返回值。一个简单的perror 会立即指出问题。

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    相关资源
    最近更新 更多