pread,pwrite,read,write區別
pread, pwrite
<code class="language-c++ hljs vala has-numbering"><span class="hljs-preprocessor">#include <unistd.h></span> <span class="hljs-comment">// 返回值: 讀到的位元組數,若已到檔案結尾則返回0,若出錯返回-1</span> ssize_t pread(<span class="hljs-keyword">int</span> filedes, <span class="hljs-keyword">void</span> *buf, size_t nbytes, off_t offset); <span class="hljs-comment">// 返回值: 若成功返回已寫的位元組數,若出錯返回-1</span> ssize_t pwrite(<span class="hljs-keyword">int</span> filedes, <span class="hljs-keyword">const</span> <span class="hljs-keyword">void</span> *buf, size_t nbytes, off_t offset);</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>
呼叫pread相當於順序呼叫lseek和read,但pread和這種呼叫又有重大區別:
- 呼叫pthread時,無法中斷其定位和讀操作
- 不更新檔案指標
呼叫pwrite相當於呼叫lseek和write,但也與它們有類似區別。
read, write
<code class="language-c++ hljs vala has-numbering"><span class="hljs-preprocessor">#include<unistd.h></span> <span class="hljs-comment">// 成功:返回讀到的位元組數;出錯:返回-1;檔案尾:返回0;</span> ssize_t read (<span class="hljs-keyword">int</span> filedes, <span class="hljs-keyword">void</span> *buf, size_t nbytes );</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
-
當從普通檔案讀時,在讀到要求位元組數之前已到達了檔案尾端。
-
當從終端裝置讀時,通常一次最多讀一行。
- 當從網路讀時,網路中緩衝機構可能造成返回值小於所要求讀的位元組數。
- 當從管道或FIFO讀時,如若管道包含的位元組少於所需的數量,那麼只返回實際用的位元組數。
- 當從某些面向記錄的裝置讀時,一次最多返回一個記錄。
- 當某一訊號造成中斷,而已經讀了部分資料量時。
- 讀操作從檔案的當前偏移量處開始,在成功返回之前,該偏移量將增加實際讀到的位元組數。
<code class="language-c++ hljs vala has-numbering"><span class="hljs-preprocessor">#include<unistd.h></span> <span class="hljs-comment">// 成功:返回已寫的位元組數;出錯:返回-1;</span> ssize_t write (<span class="hljs-keyword">int</span> filedes, <span class="hljs-keyword">const</span> <span class="hljs-keyword">void</span> *buf, size_t nbytes );</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>
- 對於普通檔案,寫操作從檔案的當前偏移量處開始
- 如果在開啟該檔案時,指定了O_APPEND選項,則在每次寫操作之前,將檔案偏移量設定在檔案的當前結尾處
- 在一次成功寫之後,該檔案偏移量增加實際寫的位元組數
總結:
-
因為歷史上有些系統不支援O_APPEND,才定義了pread和pwrite。
-
因為lseek與read之間,可能會出現非預期的效果,所以定義pread。
-
隨機訪問的話,pread/pwrite比較方便。
相關文章
- linux程式設計學習筆記(八) 檔案 定位 lseek pread pwriteLinux程式設計筆記
- HDFS read and write
- write&read&open
- nodejs read/write fileNodeJS
- read repeatable&read committed 區別MIT
- open physical standby 為read write
- CSS :read-write 選擇器CSS
- direct path read/write等待的分析
- SRAM的Write Assist與Read Assist
- read name 和 read 在 Bash 中的區別
- 當從READ ONLY到READ WRITE都做什麼了
- read committed 和 repeatable read 上鎖的區別MIT
- No read or write permission to ORACLE_HOME/.patch_storageOracle
- 表空間的狀態(二) - read/write
- 等待事件db file sequential read、db file scattered read和direct read的區別事件
- Seed Database (pdb$seed) - Read Write OR Read Only Mode in Oracle Database 12cDatabaseOracle
- Oracle常見等待事件之direct path read/writeOracle事件
- while read line 與for迴圈的區別While
- Shlomo關於everntual consistency與read-after-write consistency區別的解釋以及為什麼US Standard 沒有采用先進的read-after-wr
- Bypass McAfee Application Control--Write&Read ProtectionAPP
- MongoDB:Read and write access to data and configuration is unrestricted.MongoDBREST
- 【效能調整】等待事件(六) direct path read&write事件
- 解決direct path read 與 direct path write問題
- data file int write和db file sequential read個人想法
- 【shell】while read line 與for迴圈的區別While
- Pure_C_Read and Write PPM、PGM、PBM Three Image File FormatsORM
- mysql 5.5引數--innodb_read(write)_io_threadsMySqlthread
- Linux核心同步機制之(五):Read Write spin lock【轉】Linux
- SAP UI5裡Batch操作和Read操作的區別UIBAT
- 證明socket是全雙工,read,write是相互獨立的
- ORA-16433 The database must be opened in read write mode故障解決Database
- mysql [ERROR] InnoDB: ./ibdata1 can't be opened in read-write modeMySqlError
- 如何不使用 trn log 將read only (且能使用trn 恢復)的庫設定為read/write
- buffer busy waits, latch cache buffers chains, read by other session區別AISession
- Data Guard物理備庫read/write後,切換回備庫狀態
- ZT:oracle10g Data Guard新特性:物理備庫也可以read/writeOracle
- Oracle資料庫表空間READ ONLY、READ WRITE、ONLINE、OFFLINE狀態對應CHECKPOINT的變化Oracle資料庫
- I/O上的等待事件 —— control file sequential read/control file parallel write事件Parallel