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)分叉进程共享打开的文件描述;如果一个移动当前位置指针,它也会在另一个移动。正如您所说,这些变量不是共享的。