File-Descriptors
為什麼分叉程序之間共享文件描述符?
當我們
fork()
一個程序時,子程序繼承文件描述符。問題是,為什麼?正如我所看到的,當每個程序都試圖跟踪 r/w 指針的位置時,共享文件描述符是一件令人頭疼的事情。
為什麼做出這個設計決定?
POSIX解釋了這樣的推理:
*POSIX 程序員呼叫fork()有兩個原因。一個原因是在同一個程序中創建一個新的控制執行緒(這最初只能在 POSIX 中通過創建一個新程序來實現);另一種是創建一個執行不同程序的新程序。在後一種情況下,對fork()的呼叫很快就會呼叫其中一個exec*函式。
當
fork()
用作“窮人的執行緒”時,複製文件描述符是有意義的。必須繼續支持該案例,因此此功能將保留…
考慮一個 shell 片段
{ somecmd; othercommand *.txt; } > outputfile
shell
outputfile
在開始重定向時打開一次,然後將文件句柄傳遞給somecmd
andothercmd
,然後處理它fork
。考慮到分組,使用者期望兩個命令的輸出都以 . 結尾可能沒有錯,outputfile
就像它們最終出現在螢幕上一樣。{ }
(如果該組是一個 shell 腳本,那將是相同的。)如果文件位置對於所有程序都是獨立的,則來自的輸出
othercommand
將破壞somecmd
. 如果fork
重置文件句柄上的位置,shell 將無法傳遞othercommand
指向末尾的句柄outputfile
(因為它是 aftersomecmd
)。我們必須使用管道來收集兩個命令的輸出(它們與位置無關),並讓另一個程序連接這兩個命令的輸出:{ somecmd; othercommand *.txt } | cat > outputfile