File-Descriptors

為什麼分叉程序之間共享文件描述符?

  • January 31, 2018

當我們fork()一個程序時,子程序繼承文件描述符。問題是,為什麼?

正如我所看到的,當每個程序都試圖跟踪 r/w 指針的位置時,共享文件描述符是一件令人頭疼的事情。

為什麼做出這個設計決定?

POSIX解釋了這樣的推理

*POSIX 程序員呼叫fork()有兩個原因。一個原因是在同一個程序中創建一個新的控制執行緒(這最初只能在 POSIX 中通過創建一個新程序來實現);另一種是創建一個執行不同程序的新程序。在後一種情況下,對fork()的呼叫很快就會呼叫其中一個exec*函式。

fork()用作“窮人的執行緒”時,複製文件描述符是有意義的。必須繼續支持該案例,因此此功能將保留…

考慮一個 shell 片段

{ somecmd; othercommand *.txt; } > outputfile

shelloutputfile在開始重定向時打開一次,然後將文件句柄傳遞給somecmdand othercmd,然後處理它fork。考慮到分組,使用者期望兩個命令的輸出都以 . 結尾可能沒有錯,outputfile就像它們最終出現在螢幕上一樣。{ }(如果該組是一個 shell 腳本,那將是相同的。)

如果文件位置對於所有程序都是獨立的,則來自的輸出othercommand將破壞somecmd. 如果fork重置文件句柄上的位置,shell 將無法傳遞othercommand指向末尾的句柄outputfile(因為它是 after somecmd)。我們必須使用管道來收集兩個命令的輸出(它們與位置無關),並讓另一個程序連接這兩個命令的輸出:

{ somecmd; othercommand *.txt } | cat > outputfile

引用自:https://unix.stackexchange.com/questions/420898