Sag*_*usA 0 c semaphore mmap shared-memory
你知道为什么这个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;
}
Run Code Online (Sandbox Code Playgroud)
我已经关注了这里发现的所有相关内容,但似乎sem_init()生成了一个分段错误,我不知道为什么.我用指针犯了一些错误吗?
考虑传递给shm_open此行的标志:
int fd = shm_open(NAMESEM, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, 0);
^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
这意味着它将在第一次工作时,何时NAMESEM不存在.随后shm_opens因为失败而失败O_EXCL.这反过来又意味着ftruncate和mmap会失败.该问题的要点是这些IPC对象在程序死亡后仍然存在,直到被明确删除或直到系统重新启动.
O_EXCL如果
O_CREAT还指定了,并且已存在具有给定名称的共享内存对象,则返回错误.
但实际上,代码中的真正问题是您没有检查这些函数的返回值.一个简单的perror会立即指出问题.