在《Unix环境高级编程》第二版的第8.3节“fork函数”中,有这样一段描述:
“父进程和子进程必须共享相同的文件偏移量。考虑一个进程,它派生了一个子进程,然后等待子进程完成。假设两个进程在正常处理中都会写入标准输出。如果父进程将其标准输出重定向到某个文件(比如通过 shell),那么当子进程写入标准输出时,子进程必须更新父进程的文件偏移量。”
你的问题及回答如下:
{1} 这是什么意思?如果父进程的标准输出被重定向到例如“file1”,那么子进程写入后应该更新什么?是父进程原始标准输出的偏移量,还是重定向后的输出(即“file1”)的偏移量?不可能是后者,对吗?
答:是的,子进程要更新父进程原始标准输出的偏移量。
{2} 怎么更新呢?是由子进程显式地更新,还是由操作系统隐式地更新,或者由文件描述符本身更新?我以为 fork 后,父进程和子进程各自走各自的路,拥有自己的文件描述符副本。那么子进程如何将偏移量更新到父进程的一侧呢?
答:在 fork 后,父进程和子进程确实有各自独立的文件描述符副本,但是它们指向同一个打开的文件。当子进程从这个文件读取或写入数据时,文件偏移量会随之改变,并在子进程终止时更新到父进程的文件描述符副本中。
{3} 当调用 fork() 时,我的理解是子进程获得父进程的副本,例如文件描述符,在这种情况下,如果父进程和子进程共享的文件描述符发生了偏移量更改,只能是因为描述符本身记住了偏移量。我的理解正确吗?
答:是的,当父进程调用 fork() 创建子进程时,操作系统会复制父进程的文件描述符表到子进程中,包括文件描述符的所有状态,例如文件偏移量、文件状态标志等。因此,当子进程修改共享的文件描述符时,它也会影响父进程的文件描述符。
“父进程和子进程必须共享相同的文件偏移量。考虑一个进程,它派生了一个子进程,然后等待子进程完成。假设两个进程在正常处理中都会写入标准输出。如果父进程将其标准输出重定向到某个文件(比如通过 shell),那么当子进程写入标准输出时,子进程必须更新父进程的文件偏移量。”
你的问题及回答如下:
{1} 这是什么意思?如果父进程的标准输出被重定向到例如“file1”,那么子进程写入后应该更新什么?是父进程原始标准输出的偏移量,还是重定向后的输出(即“file1”)的偏移量?不可能是后者,对吗?
答:是的,子进程要更新父进程原始标准输出的偏移量。
{2} 怎么更新呢?是由子进程显式地更新,还是由操作系统隐式地更新,或者由文件描述符本身更新?我以为 fork 后,父进程和子进程各自走各自的路,拥有自己的文件描述符副本。那么子进程如何将偏移量更新到父进程的一侧呢?
答:在 fork 后,父进程和子进程确实有各自独立的文件描述符副本,但是它们指向同一个打开的文件。当子进程从这个文件读取或写入数据时,文件偏移量会随之改变,并在子进程终止时更新到父进程的文件描述符副本中。
{3} 当调用 fork() 时,我的理解是子进程获得父进程的副本,例如文件描述符,在这种情况下,如果父进程和子进程共享的文件描述符发生了偏移量更改,只能是因为描述符本身记住了偏移量。我的理解正确吗?
答:是的,当父进程调用 fork() 创建子进程时,操作系统会复制父进程的文件描述符表到子进程中,包括文件描述符的所有状态,例如文件偏移量、文件状态标志等。因此,当子进程修改共享的文件描述符时,它也会影响父进程的文件描述符。
_exit
而不是exit
?你能解释一下你的答案与它们之间的关系吗? - jyz