在“Unix 环境中的高级编程”第 2 版中,作者:W. Richard Stevens。第 8.3 节 fork 函数。
这是描述:
重要的是父和子共享相同的文件偏移量。
考虑一个派生一个孩子,然后等待孩子完成的过程。假设两个进程都写入标准输出作为其正常处理的一部分。如果父级将其标准输出重定向(可能是通过 shell),那么当子级写入标准输出时,父级的文件偏移量必须由子级更新。
我的回应:
{1} 这是什么意思?例如,如果父级的 std 输出被重定向到“file1”,那么子级写入后子级应该更新什么?父级的原始 std 输出偏移量或重定向输出(即 file1)偏移量?不可能是后者吧?
{2} 更新是如何完成的?由子显式,操作系统隐式,文件描述符本身?在 fork 之后,我认为父母和孩子各走各的路,有自己的文件描述符副本。那么子级如何更新到父级的偏移量呢?
在这种情况下,子进程可以在父进程等待时写入标准输出;在孩子完成后,父母可以继续写入标准输出,因为知道它的输出将附加到孩子写的任何内容。如果父级和子级不共享相同的文件偏移量,则这种类型的交互将更难以完成,并且需要父级的显式操作。
如果父母和孩子都写入同一个描述符,没有任何形式的同步,例如让父母等待孩子,他们的输出将混合在一起(假设它是一个在分叉之前打开的描述符)。尽管这是可能的,但这不是正常的操作模式。
分叉后处理描述符有两种正常情况。
父母等待孩子完成。在这种情况下,父级不需要对其描述符做任何事情。当子进程终止时,子进程读取或写入的任何共享描述符都将相应更新其文件偏移量。
父母和孩子都各走各的路。在这里,在分叉之后,父级关闭它不需要的描述符,子级也做同样的事情。这样,既不会干扰对方的开放描述符。这种情况通常是网络服务器的情况。
我的回复:
{3} 当 fork() 被调用时,我所理解的只是孩子得到了父母所拥有的副本,在这种情况下是文件描述符,并做它的事情。如果父子共享的文件描述符有任何偏移量发生变化,那只能是因为描述符本身记住了偏移量。我对吗?
我对这些概念有点陌生。