3.11 文件I/O_原子操作

1. 添寫至一個文件

    任何一個需要多個函數調用的操作都不可能是原子操作,因爲在兩個函數調用之間,內核有可能會臨時掛起該進程。

    UNIX系統提供了一種方法使這種操作成爲原子操作,該方法是在打開文件時設置O_APPEND標誌。這就使內核每次對這種文件進行寫之前,都將進程的當前偏移量設置到該文件的尾端處,於是在每次寫之前就不再需要調用lseek。

 

2. pread和pwrite函數

    Single UNIX Specification包括了XSI擴展,該擴展允許原子性地定位搜索(seek)和執行I/O。pread和pwrite就是這種擴展。

  • #include <unistd.h>
  • ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset);

返回值:讀到的字節數,若已到文件結尾則返回0,若出錯則返回-1

  • ssize_t pwrite(int filedes, const void *buf, size_t nbytes, off_t offset);

返回值:成功返回已寫的字節數,出錯返回-1

    調用pread相當於順序調用lseek和read,但是pread又與這種順序調用有下列重要區別:

  • 調用pread時,無法中斷其定位和讀操作。
  • 不更新文件指針。

 

3. 創建一個文件

    參看open函數的O_CREAT和O_EXCL選項的說明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章