C中的fork()和POSIX中共享内存的内存表示

时间:2013-10-09 17:09:21

标签: c memory posix fork shared-memory

我正在处理POSIX共享内存。

我不了解内部实施。进程如何共享内存。 我看到一些视频告诉该进程实际上没有共享内存,即如果进程A和进程B共享一些变量说x,那么包含x的逻辑页面在进程A和B中实际指向同一个主内存中的帧,这是进程共享内存的方式。

我的问题是:

  1. 当我们fork()这个过程时,会发生什么(正如我上面提到的那样)? (我的意思是假设进程-A已打开file1 file2并且现在有变量a,b,c,如果进程-A分叉进程-B,可以进程-B访问所有这些文件和变量。)

  2. 如果没有,那么如何实现该实现?

  3. 如果是,那么如何在不相关的进程之间共享内存?

3 个答案:

答案 0 :(得分:2)

  1. 不,这两个进程都有自己独立的副本。请注意,这些副本可能不兼容;例如,将两个进程写入公共文件可能会以泪流满面。

  2. 你不能;您需要明确地分享您想要分享的所有内容。

  3. 使用shm_open和朋友。

答案 1 :(得分:0)

流程有4个部分

  1. 代码段
  2. 数据段
  3. 堆栈段
  4. 堆段
  5. 执行fork()时,子进程将拥有自己的数据,创建的堆和堆栈段是父进程的精确副本。但代码段将在父级和子级之间共享。

    这就是为什么如果没有改变,你将能够看到相同的变量值。

    每个进程都有自己的本地文件描述符表。本地FDT中的每个条目都包含对全局FileTable的引用。 FT中的条目包含有关已打开文件的信息(如偏移和所有)。当数据段复制到子进程时,子进程和父进程指向FileTable中的相同条目。因此,您可以说子和父共享文件描述符。

    请注意,当两个进程一起打开同一个文件时,它们不会共享全局FileTable中的条目。当时有两个不同的参赛作品。

    我认为以上信息可以回答您的第一个问题。

    为了在进程之间显式共享变量,shm库将有助于阅读。

答案 2 :(得分:-1)

子进程从父进程继承所有IPC功能 - 也就是说,两个进程仍将在fork()之后附加到同一网段。

一般情况下(情况2,3),您通过使用“密钥”附加到任意进程的共享内存段,该密钥应该在创建时标识该段。