
檔案 I/O
|
41
perror ("write");
break;
}
len -= ret;
buf += ret;
}
附加模式
如果(透過
O_APPEND
旗標)以附加模式開啟
fd
,寫入的動作並不會發生在「檔案描述
器」的當前檔案位置,而會發生在檔案當前的末端位置。
舉例來說,假設有兩個行程試圖對同一個檔案進行寫入操作。舉個常見的例子:多個行
程共享相同的事件日誌。一開始,它們的檔案位置被正確地設定在檔案的末端。首先第
一個行程會把位元組寫入檔案的末端,然後第二個行程進行同樣的操作,若沒有附加模
式,那麼第二個行程的檔案位置將不再指向檔案的末端,而會指向檔案的末端位置減去
第一個行程所寫入的位元組數目。這意味著,在沒有明確採用任何同步機制的狀況下,
不可以有多個行程對相同的檔案進行附加操作,因為這將會造成爭用的情況。
採用附加模式可避免此問題。它可確保檔案位置總是被設定為檔案末端,所有寫入操作
總是附加到檔案末端,即使存在多個寫入者。你可以把前面的每個寫入要求,想成是會
對檔案位置進行不可分割的更新。因此,檔案位置會被更新成剛才所寫入之位元組的末
端。這並不關下一個
write()
呼叫的事,因為檔案位置的更新是自動進行的,但如果因
為某些奇怪的理由而讓下一個呼叫成為
read()
,那麼可能就無法置身事外了。
附加模式對某些工作(例如,寫出日誌檔)而言可能意義重大,但是對許多其他工作而
言可能意義不大。
非阻擋寫入操作
如果(經由
O_NONBLOCK
旗標)以非阻擋模式開啟
fd
,但是寫入要求遭到阻擋,那麼
write() ...