C中的fork()和POSIX中共享内存的内存表示
我正在使用C中的fork()和POSIX中共享内存的内存表示,c,memory,posix,fork,shared-memory,C,Memory,Posix,Fork,Shared Memory,我正在使用POSIX共享内存 我不了解内部执行情况。进程如何共享内存。 我看到一些视频告诉我进程实际上不共享内存,也就是说,如果进程A和进程B共享一些变量,比如x,那么包含x的逻辑页面,在进程A和进程B中,实际上指向主内存中的同一帧,这就是进程共享内存的方式 我的问题是: 这就是当我们fork()过程时发生的情况(正如我上面提到的)?(我的意思是假设process-A打开了file1 file2,现在有了变量A、b、c,如果process-A分叉了process-b,process-b可以访问所
POSIX
共享内存
我不了解内部执行情况。进程如何共享内存。
我看到一些视频告诉我进程实际上不共享内存,也就是说,如果进程A和进程B共享一些变量,比如x,那么包含x的逻辑页面,在进程A和进程B中,实际上指向主内存中的同一帧,这就是进程共享内存的方式
我的问题是:
fork()
过程时发生的情况(正如我上面提到的)?(我的意思是假设process-A打开了file1 file2,现在有了变量A、b、c,如果process-A分叉了process-b,process-b可以访问所有这些文件和变量。)shm\u open
和好友子进程从父进程继承所有IPC功能-也就是说,两个进程仍将附加到
fork()之后的同一段
通常(情况2、3),您可以通过使用“键”从任意进程附加到共享内存段,该键应该在创建时标识该段。进程有4段
代码段
数据段
堆栈段
堆段
当执行fork()
时,子进程将创建自己的数据、堆和堆栈段,这些数据、堆和堆栈段与父进程的数据、堆和堆栈段完全相同。但代码段将在父级和子级之间共享
这就是为什么如果不更改,您将能够看到相同的变量值
每个进程都有自己的本地文件描述符表。本地FDT中的每个条目都包含对全局文件表的引用。FT中的条目保存有关打开文件的信息(如偏移量和全部)。当数据段复制到子进程时,子进程和父进程指向FileTable中的同一条目。因此,您可以说子级和父级共享文件描述符
请注意,当两个进程同时打开同一个文件时,它们不会共享全局文件表中的条目。当时有两个不同的条目
我想以上信息回答了你的第一个问题
对于在进程之间显式共享变量,shm
库将有助于阅读。对于(2)分叉进程共享打开的文件描述;如果一个移动当前位置指针,它也会在另一个移动。正如您所说,这些变量不是共享的。