以下內容是我看《apue》第二版第三章的筆記,有錯還希望指出來,謝謝。
unbuffered i/o,跟buffered i/o相對,buffered i/o就是 iso c標準下的標準輸入輸出函式,而unbuffered i/o就是posix下的函式。
檔案描述符,個人理解就相當於linux下的uid,gid那樣具有系統標識性的數字。系統對哪個哪個檔案操作主要認的就是檔案描述符。按照慣例,在unix的shell下,0代表標準輸入,1代表標準輸出,2就代表標準出錯輸出。在遵從posix的應用程式下,0就定義成stdin_fileno,1定義成stdout_fileno,2定義成stderr_fileno。這些常量都定義在標頭檔案。早期的unix最多允許同時開啟20個檔案,現在則增加至63個。
無緩衝io主要操作的幾個函式是open,read,write,lseek,close。接下來稍微的說以下這幾個函式的用法。
open函式:
呼叫open函式可以開啟或建立乙個檔案。
#include
int open(const char *pathname, int oflag, ... /* mode_t mode */);
返回值:若成功則返回檔案描述符,出錯則返回-1
當需要建立乙個新檔案的時候才需要用到第三個引數mode,用來制定許可權(因為我現在看到第三章,而許可權在第四章才講,雖然我也知道,但是還是留到寫第四章的筆記的時候再說明吧)。
pathname是要開啟或建立檔案的名字,相對絕對路徑什麼的應該都懂吧。
oflag引數可以說明怎麼開啟這個檔案。用下列乙個或多個常量進行「或「運算來構成oflag引數。(這些常量定義在標頭檔案中)。
o_rdonly 唯讀開啟(0)
o_wronly 只寫開啟(1)
o_rdwr 讀、寫開啟(2)
上述引數必須也只能指定乙個,下列常量則是可選的:
o_creat 若檔案不存在,則建立它。需要用到第三個引數model
o_excl
o_trunc 如果此檔案存在,而且為只寫或讀寫成功開啟,就將它的長度截斷為0(就是清空檔案內容分吧)
o_noctty 如果pathname指的是終端裝置,則不將該裝置分配作為此程序的控制終端。(額,現在暫時看不太懂,懂的朋友可以跟我解釋一下,謝謝。)
o_nonblock (完全不懂就不寫了,等到時候用上在補回)
下面的三個選項也是可選的,是關於同步輸入和輸出的,有興趣可google一下:
o_dsnyc
o_rsnyc
o_snyc
如果pathname太長的話,早期的系統v版本(如svr2)會直接截掉,而且不給出任何資訊;而bsd類的系統則會返回出錯狀態,並將errno設定為enametoolong。
creat函式
也可以呼叫creat函式來建立乙個新檔案。
#include
int creat(const char *pathname, mode_t mode);
返回值:成功返回檔案描述符,出錯返回-1
此函式等效於:
open(pathname, o_wronly | o_creat | o_trunc, mode);
close函式
可呼叫close函式關閉乙個開啟的檔案
#include
int close(int filedes);
返回值:成功返回0,出錯返回-1
lseek函式
每乙個開啟的檔案都有乙個與其相關聯的「當前檔案偏移量」(current file offset)。它通常是乙個非負整數。
通常,讀、寫操作都是從當前檔案偏移量開始的,並使偏移量增加所讀寫的位元組數。預設情況下,除非是追尾操作,一般偏移量都設定為0.
#include
off_t lseek(int filedes, off_t offset, int whence);
返回值:若成功則返回新的檔案偏移量,出錯返回-1
若whence是seek_set(0),則將該檔案的偏移量設定為據檔案開始處的offset個位元組。
若whence是seek_cur(1),則將該檔案的偏移量設定為其當前值加offset,offset可正可負。
若whence是seek_end(2),則將該檔案的偏移量設定為檔案長度加offset,offset可正可負。
要是檔案偏移量超過本身檔案的長度的話,就會形成空洞檔案。
這是書上的例子:
/* create a file wtih a hole in it */
#include "apue.h"
#include char buf1 = "abcdefghij";
char buf2 = "abcdefghij";
int main(void)
用od -c 命令來檢視:
雖然我現在還是覺得有點不太懂,但是以後應該會遇到吧。
第三章筆記待續。
APUE 第三章 檔案I O
linux對檔案操作有open read write close lseek,這些api都是不帶緩衝的函式,相對於c庫,這些可移植的api內部實現是有緩衝區的。int open char pathname,int flag,int read int fd,void buf,size t size i...
APUE 第三章 習題3 2
基本思路就是使用dup尋找當前最小可用檔案描述符,找到後與將要重定向的目標檔案描述符進行比對,若比對成功則跳出,否則則將該檔案描述符存入陣列,待定位成功後依序close。如下,main中實現了書中的例程3.11 從標準輸入到標準輸出 author jjerry date 2019 01 07 11 ...
apue學習筆記(第三章 檔案I O)
本章開始討論unix系統,先說明可用的檔案i o函式 開啟檔案 讀寫檔案等 unix系統中的大多數檔案i o只需用到5個函式 open read write lseek以及close open函式 返回乙個最小的未用描述符 include int open const char pathname,i...