为什么POSIX共享内存代码会出现分段错误? #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main() { 常数int SIZE=500; const char*name=“name”; int-fd; char*ptr=NULL; pid_t pid; pid=fork(); if(pid

为什么POSIX共享内存代码会出现分段错误? #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main() { 常数int SIZE=500; const char*name=“name”; int-fd; char*ptr=NULL; pid_t pid; pid=fork(); if(pid,c,fork,posix,shared-memory,mmap,C,Fork,Posix,Shared Memory,Mmap,我基本上希望在子进程中创建一些共享内存,并从父进程访问它 在子进程中,mmap工作正常。当我使用mmap返回的指针打印时,它实际上会打印Hello,World,但相同的打印显示来自父对象的seg错误。在父对象(pid!=0)中,您仅打开了对象,但使用PROT_WRITE,MAP_SHARED对其进行了映射。去掉“保护”字,你就没事了。 您可能希望在奇数时间检查返回值是否有错误。崩溃是由于以下摘录引起的: O_rdo仅打开对象进行读取访问。共享内存对象 以这种方式打开的mmap(2)只能用于读取

我基本上希望在子进程中创建一些共享内存,并从父进程访问它

在子进程中,
mmap
工作正常。当我使用
mmap
返回的指针打印时,它实际上会打印
Hello,World,但相同的打印显示来自父对象的seg错误。

在父对象(pid!=0)中,您仅打开了对象,但使用PROT_WRITE,MAP_SHARED对其进行了映射。去掉“保护”字,你就没事了。
您可能希望在奇数时间检查返回值是否有错误。

崩溃是由于以下摘录引起的:

O_rdo仅打开对象进行读取访问。共享内存对象
以这种方式打开的mmap(2)只能用于读取
(保护读取)访问。
您已尝试:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/mman.h>

int main()
{
    const int SIZE = 500;
    const char *name = "name";
    int fd;
    char *ptr = NULL;
    pid_t pid;
    pid = fork();

    if (pid < 0) {
        fprintf(stderr, "Fork Failed");
        return 1;
    }
    else if (pid == 0) {
        fd = shm_open(name,O_CREAT | O_RDWR,0666);
        ftruncate(fd, SIZE);
        ptr = (char *)mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
        sprintf(ptr, "%s", "Hello, World!\n");
        return 0;
    }
    else {
        wait(NULL);
        fd = shm_open(name, O_RDONLY, 0666);
        ptr = (char *)mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
        printf("%s\n", (char *)ptr);
    }
    return 0;
}

另一句话:您的
名称
应遵循便携性建议:

对于便携使用,共享内存对象应通过名称标识
形式/名称的名称;也就是说,以null结尾的字符串最多为
NAME_MAX(即255个)字符,由初始斜杠组成,
后跟一个或多个字符,其中没有一个是斜杠。
最后,您有一些不必要的
(char*)
强制转换,并且总是对返回值进行错误检查

fd = shm_open(name, O_RDONLY, 0666);
//                  ^^^^^^^^
ptr = (char *)mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
//                                    ^^^^^^^^^^^^ incorrect!