【问题标题】:How to store nodes of a list into shared memory如何将列表的节点存储到共享内存中
【发布时间】:2019-04-11 01:54:04
【问题描述】:

我试图让许多客户端通过许多终端相互通信。我在我的程序中有分叉,我创建了管道,以便客户端可以读取/写入其他客户端。因为我创建了许多进程,所以我需要共享内存存储一些信息,特别是我想存储每个孩子创建的节点。我该怎么做?

这是我的结构:

typedef struct client{
    char *numofclient;
    struct client *nextclient;
}client;

【问题讨论】:

    标签: c pipe fork shared-memory


    【解决方案1】:

    在 fork 之前使用 mmap 创建一个共享内存区域。阅读手册页并使用共享标志。如果在 Windows 上有所不同,请查看 VirtualAlloc,当然你不能分叉。

    您需要一个用于共享内存的内存分配器。这可以非常简单:只需为分配增加一个 char 指针,而永远不要释放任何东西。或者它可以像你想要的那样复杂。您也许可以在网上找到图书馆。

    如果您需要一个互斥锁,请在共享内存区域创建一个,并确保使用共享互斥锁的标志。

    由于您正在分叉,因此您可以使用指针,因为共享内存将在每个进程副本中保持映射到位。否则,您需要使用地图起点的偏移量。

    【讨论】:

    • 但是我将如何创建和存储新节点,以便在共享内存中有一个完整的列表。我认为 Malloc 不是一个选项。
    • @MichalisAndroulakis:是的,您需要自己的 malloc 来共享内存。编写自己的函数来获取大小并返回指针。
    【解决方案2】:

    我认为您可以使用 shmget 使 systemV 共享内存,阅读手册页。 您可以决定将要创建多少进程的上限,并相应地为 shmget 提供该大小。 因此,每当您的子进程想要存储列表时,它都可以附加到共享内存并将其数据附加到共享内存中。

    【讨论】:

    • 是的,这就是我正在做的事情,但我正在努力创建节点并将其存储在共享内存中,这就是我正在做的事情:key_t key=ftok("shmemory",1024); int shmid=shmget(key,9*sizeof(client),IPC_CREAT|0660); if(shmid 共享; shared=(char) shmat(shmid,(void*)0,0);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2021-01-28
    • 2011-10-23
    相关资源
    最近更新 更多