2017-09-06 26 views
1

ers: 有一個問題困擾我。據我所知,有兩種方法可以在Linux中調用write()。像這樣: 代碼1:這是正確的方式來調用write()?

write(DEV, buf, count); 

代碼2:

int write_total = 0; 
while (write_total < count) { 
    int len = write(DEV, buf, count); 
    write_total += len; 
} 

有什麼區別,如果DEV是網絡或設備? 我的領導告訴我Code2是正確的方法,如果DEV是網絡fd,因爲它的流媒體。 誰給文字計數字符安全的DEV?內核還是程序員?

謝謝!

+1

這取決於一個*很多*的FD是指向什麼樣的對象,但是一般來說,你應該使用第二個(修復錯誤,處理錯誤,並且通常在EAGAIN上緩衝) – o11c

+1

'pipe(7)'是一個很好的解讀,因爲它顯示了大多數有趣的行爲,沒有太多很多絨毛。 – o11c

+0

你應該仔細閱讀[寫(2)](http://man7.org/linux/man-pages/man2/write.2.html)(更一般地說,你正在使用的每個功能的文檔) –

回答

1

write實際上可能會寫更少的字節可能比您要求的更多,因此不能依賴第一個選項。

但是,第二個選項也是不可行的,因爲如果它寫了你請求的二十個字節中的十個字節中的十個,那麼你將嘗試再次寫入所有的這些字節。

更好的方法開始是這樣的:

int bytes_written = 0; 
while (bytes_written < count) { 
    int len = write(DEV, &(buf[bytes_written]), count - bytes_written); 
    if (len < 0) 
     break; 
    bytes_written += len; 
} 

此調整嘗試基於已經寫入量每次寫入數據。它也檢測錯誤並在這種情況下停止操作。

而且,不用說(a),這可能應該被重構爲write_no_matter_what()函數,以便您的主代碼不會像這樣重複的段落。


(一)然而,對於一些奇怪的原因不明給我,我說這:-)

+0

哦,是的,謝謝你的耐心。 :-) –

相關問題