unix系統中實現讀寫的原子操作

2021-08-30 09:08:44 字數 712 閱讀 4993

lseek(fd,0l,2)          /*將檔案位置指標定位到檔案末尾*/

write(fd,buf,size)     /*將buf中的size個位元組寫入檔案*/

但這裡有乙個問題就是,如果系統是支援多程序的話,就會有可能發生錯誤。

因為如果兩個程序均使用該方法向同乙個檔案末尾新增內容,當第乙個程序執行完第一步之後,此時來了乙個中斷或其它原因導致系統暫停程序1的執行,而切換到程序2,並依照上述2步走的方案向檔案新增了內容,且此時檔案大小也進行了更新,然後系統再恢復到程序1中執行。由於之前程序1已經完成了檔案寫指標的獲取,所以它直接向指標指向的位置寫入內容。到這裡問題就發生了,它寫入的內容會覆蓋之前程序2寫入的內容。因為程序1再程序2完成檔案的寫入之後並沒有再更新它的檔案位置指標。

所以為了避免上述的問題,今天就向大家介紹兩個原子函式:

#include ssize_t pread(int fd,void *buf,size_t size,off_t offset);

ssize_t pwrite(int fd,void *buf,size_t size ,off_t offset);

這兩個函式執行成功時返回讀寫的位元組數,失敗時返回-1。呼叫他們相當與先呼叫lseek函式再呼叫讀寫函式,且二者是緊緊相連的,中間不會被系統所打斷,即保證了操作的原子性。

嵌入式linux&arm

csdn部落格

知乎專欄

Linux裝置驅動中的併發控制之四(原子操作)

7.4 原子操作 原子操作指的是在執行過程中不會被別的 路徑所中斷的操作。linux核心提供一系列函式來實現核心中的原子操作,這些函式分為兩類,分別針對位和整型變數進行原子操作。位和整型變數的原子操作都依賴於底層cpu的原子操作,因此所有這些函式都與cpu架構密切相關。原子操作主要用於實現資源計數,...

linux系統中讀寫鎖的問題

問題描述 我們的應用程式採用了共享記憶體和讀寫鎖的機制來實現多程序的併發訪問,但測試時發現讀寫鎖有問題,我們所採用的鎖是pthread rwlock rdlock pthread rwlock wrlock這組函式。現象 pthread rwlockattr setpshared attr,pthr...

Unix系統中刪除檔案明中的空格的方法

今天臨校師兄 上說有沒有批量刪除檔名中的空格的方法。這類問題像我這等懶人加閒人是最喜歡的了。於是滿口答應下來說試試看。我們的網路中心有一台freebsd伺服器供學校的unix愛好者登入學習,兼之網路中心可以在裡面物色新的成員。這個伺服器是由我來維護的,招新人也是由我負責的。為了便於管理和教學,我計畫...