0

我正在研究POSIX共享内存。

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

我的问题是:

  1. 这就是(正如我上面提到的)我们fork()的过程中发生的事情?(我的意思是假设 process-A 已经打开了 file1 file2 并且现在有变量 a,b,c 如果 process-A 派生了 process-B ,那么 process-B 可以访问所有这些文件和变量。)

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

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

4

3 回答 3

2
  1. 不,这两个进程都有自己独立的所有内容副本。请注意,这些副本可能不兼容;例如,让两个进程都写入一个公共文件可能会以泪水告终。

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

  3. 使用shm_open和朋友。

于 2013-10-09T17:12:46.883 回答
0

进程有4个段

  1. 代码段
  2. 数据段
  3. 堆栈段
  4. 堆段

执行时fork(),子进程将拥有自己的数据、堆和堆栈段,它们是父进程的精确副本。但是代码段将在父子之间共享。

这就是为什么如果不更改,您将能够看到相同的变量值。

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

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

我假设以上信息回答了您的第一个问题。

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

于 2013-10-09T17:38:05.807 回答
-1

子进程继承父进程的所有 IPC 特性——也就是说,两个进程在fork().

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

于 2013-10-09T17:12:47.723 回答