(进程学习三)调用 fork 时,打开的文件会发生什么情况?

今天继续学习进程,今天研究的是:调用 fork 时,打开的文件会发生什么情况?

当某个进程复制它自身时,内核生成所有打开的文件描述符的副本。文件描述符是指向打开的文件或设备的整数,并用于执行读取和写入。如果在调用 fork 前,某个程序已经打开了一个文件,如果两个进程都尝试执行读取或写入,会发生什么情况呢?一个进程会改写另一个进程中的数据吗?是否会读取该文件的两个副本?清单 5 对此进行了研究,它打开两个文件——一个文件用于读取,另一个文件用于写入——并让父进程和子进程同时执行读取和写入。

清单 5. 同时对同一文件执行读取和写入的两个进程

其中infile文件中的内容为:

编译,运行的结果:

清单5 是用于打开文件的简单程序,并派生 (fork) 为父进程和子进程。每个进程从同一文件描述符(它只是一个包含数字 1 至 8的文本文件)执行读取操作,并连同 PID 一起打印所读取的内容。在读取一行之后,将 PID 写到输出文件。当输入文件中没有其他字符可供读取时,循环结束。

清单5 的输出表明,当一个进程从该文件读取时,两个进程的文件指针都在移动。同样地,当向某个文件写入时,下一个字符被写到文件结尾。这是非常有意义的,因为内核跟踪打开文件的信息。文件描述符只不过是进程的标识符。

您可能还知道,标准输出(屏幕)也是一个文件描述符。此文件描述符在 fork 调用期间被复制,这就是两个进程都能对屏幕执行写入操作的原因。

(未完待续)

发表评论

电子邮件地址不会被公开。 必填项已用*标注