Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Mmap与结构_C_Pointers_Mmap - Fatal编程技术网

C Mmap与结构

C Mmap与结构,c,pointers,mmap,C,Pointers,Mmap,我正在编写一些代码,包括进程之间的通信,使用信号量。我制作了这样的结构: typedef struct container { sem_t resource, mutex; int counter; } container; 并以这种方式使用(在主应用程序中,在下级流程中也是如此) 当我使用其中一个sem_u函数时,一切都很好,但是当我尝试执行以下操作时 memory->counter = 5; 它不起作用。也许我的指针有问题,但我几乎什么都试过了,似乎什么都没用。也许

我正在编写一些代码,包括进程之间的通信,使用信号量。我制作了这样的结构:

typedef struct container {
    sem_t resource, mutex;
    int counter;
} container;
并以这种方式使用(在主应用程序中,在下级流程中也是如此)

当我使用其中一个sem_u函数时,一切都很好,但是当我尝试执行以下操作时

memory->counter = 5;
它不起作用。也许我的指针有问题,但我几乎什么都试过了,似乎什么都没用。也许有更好的方法在进程之间共享变量、结构等?
不幸的是,我不允许使用boost或类似的东西,代码是出于教育目的,我打算尽量保持简单

因为在
shm\u open()
之前使用的是
shm\u unlink()
,所以您的两个进程从不打开同一个共享内存对象-每个进程都在创建一个新的、不同的对象(即使它们具有相同的名称)


不清楚你所说的“不起作用”是什么意思。以下基于您的代码的最小示例对我来说很好。这对你有什么好处

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

typedef struct container {
    sem_t resource, mutex;
    int counter;
} container;

int main()
{
    container *memory;
    int fd = shm_open("MYSHM", O_RDWR|O_CREAT|O_EXCL, 0);

    if(fd == -1) {
        perror("shm_open");
        return 1;
    }

    ftruncate(fd, sizeof(container));
    memory = mmap(NULL, sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    memory->counter = 5;
    printf("%d\n", memory->counter);

    return 0;
}

你为什么叫shm_开门?一个很好的方法是在某个路径名上调用“open”并使用它。

不是这样;内存->计数器=5;即使只在主应用程序中使用它也不起作用。@blid..pl:
ftruncate()
调用也应该在
mmap()
调用之前。@caf:ftruncate()显然与我的问题无关。@bild..pl:你需要解释一下“不起作用”的确切含义。我已经用一个简单的例子更新了我的答案,这个例子在这里很好用。它现在很好用,但只适用于主程序。事实证明,我包含了太多不必要的库,这导致了seg故障。但我的问题仍然存在,在其他进程中,我无法读取我在主应用程序的共享内存中放入的内容。有太多的代码无法粘贴到这里,所以下面是链接:Main app(通过参数传递fd到进程):Reader(尝试读取Main app中的内容):Writer只包含Main()。volatile?也许编译器并没有在你认为是的时候编写。我写了很多东西,或多或少都是这样。我不建议ftruncate小于一页,尽管我怀疑这会给您带来麻烦。@b参数:volatile add to structure(或内部,仅限于int变量)仍然不能解决我的问题。你能提供一些代码吗?我不确定ftruncate会使文件变长。如果设置断点,ls会告诉您长度是多少?
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>

typedef struct container {
    sem_t resource, mutex;
    int counter;
} container;

int main()
{
    container *memory;
    int fd = shm_open("MYSHM", O_RDWR|O_CREAT|O_EXCL, 0);

    if(fd == -1) {
        perror("shm_open");
        return 1;
    }

    ftruncate(fd, sizeof(container));
    memory = mmap(NULL, sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    memory->counter = 5;
    printf("%d\n", memory->counter);

    return 0;
}
fdflags = fcntl(fd, F_GETFD);
fdflags &= ~FD_CLOEXEC;
fcntl(fd, F_SETFD, fdflags);