2010-09-08 43 views
0

我正在使用帶文件描述符的寫入函數寫入文本文件,並設置了O_NONBLOCK。Linux寫入函數

fd = open(filepath, O_RDWR | O_NONBLOCK , 0777); 
write(fd, string, size); 

的問題,我有如下:

  1. 多大的文件緩存大小,直到它被阻止?

  2. 如果我如上所述使用O_NONBLOCK,如果緩衝區已滿,會發生什麼情況?該字符串將被丟棄?

  3. 那麼對於寫O_NONBLOCK,我應該經常檢查寫入的返回值,看它是否與我們想寫的字符串的長度相同?

  4. 如何測試文件寫入緩衝區已滿的現象?我已經創建了一個任意長的字符串,但似乎仍然無法生成效果字符串放置。

謝謝。

回答

0

寫入可能無法完全寫入fd的原因有很多。

U可以很容易地在套接字,管道等中模擬阻塞,如果另一端的用戶沒有從流中讀取數據,寫入將被阻塞。

如果您用NON_BLOCK打開了fd,那麼寫入操作會立即寫入寫入流的字節數。 可以使用此信息重試剩餘數據的操作。在任何情況下,都不會放棄「字符串」。

0
  1. 這是故意留下未指定的,你的代碼不應該知道或關心。
  2. write()將返回一個小於或等於零的數字,在這種情況下,errno將被設置爲EAGAIN。
  3. 當然。然後從最後一次寫入()離開的地方重試。
  4. 試着寫到標準輸出(FD = 1),並通過管道運行您的程序,即

myprogram | (睡眠30;貓)

1

O_NONBLOCK對文件描述符(*)沒有影響。通常,緩存中的操作系統已經緩存了write(),OS /文件系統本身決定數據何時應該放入磁盤。 O_NONBLOCK只能用於套接字,fifos和管道。

如果你需要異步文件I/O,你應該檢查aio_write()

否則重申,write()已經是異步的,不等待磁盤IO完成除非你使用O_SYNCO_DSYNCO_DIRECT標誌。 (*)在Linux下打開()與O_NONBLOCK文件只是一個提示,程序不打算讀取或寫入文件 - 但只做阻擋層調用ioctl()


Edit1。現實檢查我沒有做白日夢。 As per POSIXv6

O_NONBLOCK
當打開一個FIFO與O_RDONLY或O_WRONLY設置:
[...跳過...]
當打開一個塊特殊或字符特殊文件支持 無阻塞打開:
[...跳過...]
否則,O_NONBLOCK的行爲未指定。