fork()函數(shù) UNIX編程中fork()的使用是怎樣的原理?
UNIX編程中fork()的使用是怎樣的原理?首先解釋一下:在UNIX/Linux中,父進程調(diào)用fork生成子進程,父進程打開的文件描述符會被復(fù)制到子進程中,子進程通過父進程復(fù)制的文件描述符與父進程共
UNIX編程中fork()的使用是怎樣的原理?
首先解釋一下:在UNIX/Linux中,父進程調(diào)用fork生成子進程,父進程打開的文件描述符會被復(fù)制到子進程中,子進程通過父進程復(fù)制的文件描述符與父進程共享打開文件的文件條目。為什么要分享?考慮到實際問題,在類UNIX操作系統(tǒng)中生成新進程的唯一方法是fork調(diào)用。大多數(shù)fork調(diào)用只有兩個目的:1)一個進程創(chuàng)建自己的副本來實現(xiàn)多進程模型,需要共享打開的文件描述符來進行同步。2) Fork是一個子進程,它調(diào)用exec函數(shù)來執(zhí)行新進程??紤]在命令行中執(zhí)行程序的方法。所有程序都是shell fork并調(diào)用exec的子進程。因此,可以直接使用stdin、stdout、stderr等環(huán)境變量。
為了解決您的問題:“fork之后,我們將調(diào)用exec來執(zhí)行另一個程序。此時,我們將用一個新程序替換子進程的主體、數(shù)據(jù)、堆和堆棧。在這種情況下,子進程的文件描述符表所占用的內(nèi)存將自動釋放。為什么我們還有是否關(guān)閉子進程的文件描述符?”文件描述符由內(nèi)核維護,并在任何情況下通過引用計數(shù)技術(shù)由內(nèi)核釋放。因此,exec不會影響內(nèi)核中的文件表條目,因此不會影響進程打開的文件描述符表。Only fork只是將父進程打開的文件描述符復(fù)制到子進程,然后父子進程共享文件表條目。
最后,您可以設(shè)置Exec位上文件的關(guān)閉,以在執(zhí)行Exec時關(guān)閉文件描述符。