我想了解三個流的行爲 - stdout
,stdin
和stderr
。我無法從任何教科書中得到答案,所以我來到了這裏。stdin,stdout和stderr在?之間共享?
我知道這三個存儲在文件描述符表中,文件描述符爲0(標準輸入),1(標準輸出)和2(標準錯誤)。我也知道這些不僅僅是文件描述符,而是可以被重定向的I/O流。好的,那麼分享怎麼樣?
考慮三種情況:
- 當叉子()被調用:子進程和父進程共享文件描述符,但它們具有相同的標準輸入,輸出和錯誤?
- 當一個線程被創建時:線程共享文件描述符,但I/O流?
- 當execl()被調用時:在這種情況下,當前過程映像被新的過程映像覆蓋。如果我這樣做
execl("./a.out", "a.out", NULL);
,那麼這個新的可執行文件會得到stdin,stderr和stdout的全新拷貝嗎?
明智的答案是值得歡迎的。
謝謝你的精心答覆。我發現它有點難以接受。據我瞭解,對於情況2和3,stdin,stdout和stderr是共享的。我無法理解fork()的情況。 你在說如果一個文件被父進程打開,並且被子進程再次打開;這兩個文件描述符是獨立的? – 0aslam0 2014-11-02 06:31:32
也請在這裏檢查。 http://stackoverflow.com/questions/26696811/making-stdin-writable-in-a-safe-and-portable-way – 0aslam0 2014-11-02 07:45:14
是的,在情況2個3的標準流被共享,線程總是共享進程和EXECL ()不會更改進程(它只會更改進程運行的內容)。在fork()的情況下,繼承的流仍然可用於子進程。在這種情況下,數據從父進程和子進程都流向哪個進程接收數據。 – 2014-11-04 20:51:10