我try 打开一个共享内存文件,写入其中,派生到新进程,然后调用execl来运行其他组件,然后在这些组件中访问在父进程中创建的共享内存.但我不想要整个 struct ,只想要其中的一部分.所以我使用offsetof来找到偏移量,并将其传递给mmap.问题是,当我将偏移量更改为非零值时,它会给出无效参数错误.它在零的情况下工作得很好.

我制作了一个带有相同错误的最小伪程序,而较大程序的代码太大. `

#include<stdio.h>
#include<unistd.h>
#include<sys/mman.h>
#include<stddef.h>
#include<fcntl.h>

typedef struct test
{
    int moo;
    char hello;
}Lil;


typedef struct bigstruct
{
    int a;
    char cow;
    Lil lil;
}Big;

int main()
{
    int fd = shm_open("/moomor", O_CREAT | O_RDWR, 0666);
    if(fd == -1)
    {
        perror("shmopen");
        return 1;
    }
    ftruncate(fd, sizeof(Big));
    Big * big = (Big *)mmap(NULL, sizeof(Big), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if(big == MAP_FAILED)
    {
        perror("mmap");
        return 1;
    }
    big->lil.hello = 'h';
    printf("hello: %c\n", big->lil.hello); //prints correctly
    munmap(big, sizeof(Big)); //tried it with this in and out

    int offset = offsetof(Big, lil); //gives offset of eight
    printf("Offset: %d\n", offset);
    Lil *lily = (Lil *)mmap(NULL, sizeof(Lil), PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
    if(lily == MAP_FAILED)
    {
        perror("mmap"); //this causes an error
        goto cleanup;
    }
    printf("HH: %c\n", lily->hello);
    munmap(lily, sizeof(Lil));

    cleanup:
    shm_unlink("/moomor");
    close(fd);
}

推荐答案

假设您使用的是基于Linux的平台,函数mmap的手册页说明如下:

偏移量必须是sysconf(_SC_PAGE_SIZE)返回的页面大小的倍数.

在您发布的代码中,您似乎违反了这一规则.

C++相关问答推荐

librsvg rsvg_handle_get_dimensions获取像素大小与浏览器中的渲染大小没有不同

为什么静态说明符为内联函数生成外部定义?

是否定义了数组指针类型转换为指针类型?""""

丑陋的三重间接:可扩展的缓冲区管理 struct

空指针的运行时强制转换

如何在C中通过套接字自定义数据类型读取原始变量?

为静态库做准备中的奇怪行为

Make Node函数.S有什么问题吗?

轮询libusb_pollfd struct 列表的正确方式是什么?

struct -未知大小

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

在C++中允许使用字符作为宏参数

pthread_create的用法

C语言中奇怪的输出打印数组

如何对现有的双向循环链表进行排序?

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

为什么会导致分段故障?(C语言中的一个程序,统计文件中某个单词的出现次数)

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

const struct 成员的 typedef 中的灵活数组大小

SSE 向量与 Epsilon 的比较