《APUE》第三章筆記(1)

2021-06-28 08:19:19 字數 2575 閱讀 9463

以下內容是我看《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...