我正在处理POSIX
共享内存。
我不了解内部实施。进程如何共享内存。 我看到一些视频告诉该进程实际上没有共享内存,即如果进程A和进程B共享一些变量说x,那么包含x的逻辑页面在进程A和B中实际指向同一个主内存中的帧,这是进程共享内存的方式。
我的问题是:
当我们fork()
这个过程时,会发生什么(正如我上面提到的那样)? (我的意思是假设进程-A已打开file1 file2并且现在有变量a,b,c,如果进程-A分叉进程-B,可以进程-B访问所有这些文件和变量。)
如果没有,那么如何实现该实现?
如果是,那么如何在不相关的进程之间共享内存?
答案 0 :(得分:2)
不,这两个进程都有自己独立的副本。请注意,这些副本可能不兼容;例如,将两个进程写入公共文件可能会以泪流满面。
你不能;您需要明确地分享您想要分享的所有内容。
使用shm_open
和朋友。
答案 1 :(得分:0)
流程有4个部分
执行fork()
时,子进程将拥有自己的数据,创建的堆和堆栈段是父进程的精确副本。但代码段将在父级和子级之间共享。
这就是为什么如果没有改变,你将能够看到相同的变量值。
每个进程都有自己的本地文件描述符表。本地FDT中的每个条目都包含对全局FileTable的引用。 FT中的条目包含有关已打开文件的信息(如偏移和所有)。当数据段复制到子进程时,子进程和父进程指向FileTable中的相同条目。因此,您可以说子和父共享文件描述符。
请注意,当两个进程一起打开同一个文件时,它们不会共享全局FileTable中的条目。当时有两个不同的参赛作品。
我认为以上信息可以回答您的第一个问题。
为了在进程之间显式共享变量,shm
库将有助于阅读。
答案 2 :(得分:-1)
子进程从父进程继承所有IPC功能 - 也就是说,两个进程仍将在fork()
之后附加到同一网段。
一般情况下(情况2,3),您通过使用“密钥”将附加到任意进程的共享内存段,该密钥应该在创建时标识该段。