原创 3.11 文件I/O_原子操作

1. 添寫至一個文件     任何一個需要多個函數調用的操作都不可能是原子操作,因爲在兩個函數調用之間,內核有可能會臨時掛起該進程。     UNIX系統提供了一種方法使這種操作成爲原子操作,該方法是在打開文件時設置O_APPEND標誌。

原创 5.4 標準I/O庫_緩衝

    標準I/O提供了三種類型的緩衝。 全緩衝: 在填滿標準I/O緩衝區後才進行實際I/O操作。對於駐留在磁盤上的文件通常是有標準I/O庫實施全緩衝。 行緩衝: 當在輸入和輸出中遇到換行符時,標準I/O庫執行I/O操作。當涉及一個終端(

原创 3.12 文件I/O_dup和dup2函數

    下面兩個函數都可用來複制一個現存的文件描述符: #include <unistd.h> int dup(int filedes); int dup2(int filedes, int filedes2); 返回值:成功返回新的文件

原创 3.14 文件I/O_fcntl函數

    fcntl函數可以改變已打開的文件的性質。 #include <fcntl.h> int fcntl(it filedes, int cmd, .../* int arg */); 返回值:成功則依賴於cmd,出錯返回-1    

原创 5.5 標準I/O庫_打開流

    下列三個函數打開一個標準I/O流。 #include <stdio.h> FILE *fopen(const char *restrict pathname, const char *restrict type); FILE *f

原创 5.9 標準I/O庫_二進制I/O

    下列兩個函數執行二進制I/O操作: #include <stdio.h> size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);

原创 3.17 文件I/O_小結

    因爲read和write都在內核執行,所以稱這些函數爲不帶緩衝的I/O函數。     將ioctl用於STREAMS I/O系統,將fcntl用於記錄鎖。

原创 5.11 標準I/O庫_格式化I/O

1. 格式化輸出     執行格式化輸出處理的是4個printf函數。 #include <stdio.h> int printf(const char *restrict format, ...); int fprintf(FILE *

原创 5.2 標準I/O庫_流和FILE對象

    在第3章中,所有I/O函數都是針對文件描述符的。而對於標準I/O庫,它們的操作則是圍繞流進行的。當用標準I/O庫打開或創建一個文件時,我們已使一個流與一個文件相關聯。     對於ASCII字符集,一個字符用一個字節表示。對於國

原创 3.16 文件I/O_/dev/fd

    打開文件/dev/fd/n等效於複製描述符n(假定描述符n是打開的)[dup]。     大多數系統忽略它所指定的mode,而另外一些則要求mode必須是所涉及的文件原先打開時所使用mode的子集。   點贊

原创 3.13 文件I/O_sync、fsync和fdatasync函數

    當將數據寫入文件時,內核通常先將該數據複製到其中一個緩衝區中,如果該緩衝去尚未寫滿,則並不將其排入輸出隊列,而是等待其寫滿或者當內核需要重用該緩衝區以便存放其他磁盤塊數據時,再將該緩衝排入輸出隊列,然後待其到達隊首時,才進行實際的

原创 5.3 標準I/O庫_標準輸入、標準輸出和標準出錯

    標準輸入、標準輸出和標準出錯用文件描述符引用是:STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,而用文件指針引用是:stdin、stdout和stderr。 點贊 收藏 分

原创 3.18 文件I/O_習題

3.1     所有的磁盤I/O都要經過內核的塊緩衝區(也稱爲內核的緩衝區高速緩存),唯一例外的是對原始磁盤設備的I/O。“不帶緩衝的I/O”指的是在用戶的進程中對這兩個函數不會自動緩衝,每次read或write就要進程一次系統調用。  

原创 5.10 標準I/O庫_定位流

    有三種方法定位標準I/O流。 ftell和fseek函數。它們都假定文件的位置可以存放在一個長整型中。 ftello和fseeko函數。可以使文件偏移量不必一定使用長整型。它們使用off_t數據類型代替了長整型。 fgetpos和

原创 5.13 標準I/O庫_臨時文件

    ISO C標準I/O庫提供了兩個函數以幫助創建臨時文件。 #include <stdio.h> char *tmpnam(char *ptr); 返回值:指向唯一路徑名的指針 FILE *tmpfile(void); 返回值:成功