【问题标题】:What happens at the intermediate pointer table when a process is forked? C fork function当一个进程被分叉时,中间指针表会发生什么? C 叉函数
【发布时间】:2021-04-08 20:46:37
【问题描述】:

您可能知道,进程中的文件描述符标识文件操作(读取、写入...)。当我们对这些文件进行操作时,我们必须与操作系统进行通信,因为它是管理文件的那个。为此,操作系统有一个中间指针表,其中为每个进程中每个打开的 FD 创建一个条目。此表包含有关所有打开的 FD 的信息(文件指针、操作类型...)。我的问题是,当一个进程被分叉时,这个表会发生什么?我直观的回答是,属于分叉进程的表条目在表中重复,以便在子进程中有其他中间指针,但我没有找到任何有关此的信息,所以我很高兴有人澄清这一点。

先谢谢=)

【问题讨论】:

  • parent 和 child 没有区别,它们基本上都是副本,除了 fork() 调用的返回值。 [嗯:还有一些额外的 minor 差异,主要涉及锁和信号。请参阅这些的手册页]
  • 我认为我的问题被误解了,因为我说的不是进程的 FDs 表,而是 OS 上的表。
  • 请阅读一些书籍(巴赫,史蒂文斯,...) 有每个进程表和系统文件表。一切尽在书中。

标签: c unix fork file-descriptor


【解决方案1】:

表格重复。复制不只是memcpy() 并且未完成的 IO 仅在父进程中完成。子代继承父代的所有句柄。内核文件对象本身是重复的,只是它们的表引用。

【讨论】:

  • “文件句柄...不重复”是什么意思?如果 FILE * 缓冲区中有未刷新的数据,则最终会从每个进程中打印出来,这意味着该对象是重复的。
  • @WilliamPursell 我将“文件句柄”读作“文件描述符”,而duplicating a file descriptor has strictly-defined semantics 不适用于跨fork() 的文件描述符继承。但其他解释是可能的......
  • @WilliamPursell:我肯定没有把它读作 C FILE * 对象。 fork() 的行为很丑陋。
  • 我想我的问题真的是,“文件句柄”是什么意思?有FILE *'s、文件描述符和文件描述。 “文件句柄”有具体的定义吗?
  • @WilliamPursell:如果 OP 回来说他想知道FILE *,请告诉我,我会为此写下答案。
猜你喜欢
  • 2011-01-24
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
相关资源
最近更新 更多