網路知識總結 (五)高階I O函式

2021-08-22 18:02:20 字數 2182 閱讀 2139

pipe 函式用於建立乙個管道,以實現程序間通訊。

#include

int pipe(int fd[2]);

引數是乙個包含兩個 int 型整數的陣列指標。

成功:返回 0 ,並將一對開啟的檔案描述符值傳入陣列中。

失敗:返回 -1,並設定errno。

通過 pipe 函式建立的兩個檔案描述符 fd[0] 和 fd[1] 分別構成管道的兩端。fd[0] 用於從管道中讀出,fd[1] 用於向管道中寫入。如果要實現雙向通訊,就需要使用兩個管道。預設情況下,這一對檔案描述符都是阻塞的。

管道內部傳輸的資料時位元組流,管道容量的大小預設是 65535 位元組,可以使用 fcntl 函式修改管道容量。

重定向,例如將標準輸入重定向到乙個檔案,或者把標準輸出重定向到乙個網路連線(比如 cgi 程式設計)。

/include

int dup(int file_descriptor);

int dup2(int file_descriptor_one, int file_descriptor_two);

dup函式:建立乙個新的檔案描述符,新的檔案描述符和原來的 file_descriptor 指向同乙個檔案、管道或網路連線。並且 dup返回的檔案描述符總是取系統當前可用的最小整數值。

dup2函式:返回第乙個不小於 file_descriptor 的第乙個整數。

sendfile 函式:在兩個檔案描述符之間直接傳遞資料(完全在核心中操作),從而避免了從核心緩衝區和使用者緩衝區之間的資料拷貝,效率高,被稱為零拷貝。

#include

ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count);

sffset:指定從哪個位置開始讀,為空則預設起始位置。

count:讀多少位元組。

注意:in_df 必須指向真實的檔案,不能是管道 和 socket ,out_fd 必須是乙個 socket 。可見 sendfile 是專門為網路傳輸而設計的。

mmap 函式:用於申請一段記憶體空間,可以將這段記憶體作為程序間通訊的共享記憶體,也可以將檔案直接對映到其中。

munmap 函式:釋放由 mmap 函式建立的記憶體空間。

#include

void* mmap(void* start, size_t length, int prot, int flags, int fd, sff_t offset);

int munmap(void* start, size_t length);

start:這段記憶體的起始位址。設定為 null ,系統自動分配位址。

legth:記憶體段的長度。

prot:設定記憶體段的訪問許可權。可以取以下的按位或:rrot_read,記憶體段可讀。rrot_write,記憶體段可寫。rrot_exec,記憶體段可執行。rrot_none,記憶體段不能被訪問。

flags:控制記憶體段內容被修改後程式的行為。

fd:被對映檔案對應的檔案描述符。

mmap->成功:返回目標記憶體區域指標。 失敗:返回map_failed((void*)-1)並設定 errno 。

munmap->成功:返回 0 。 失敗:返回 -1 並設定 errno 。

fcntl 函式:(file control)提供了對檔案描述符的各種控制操作。

#include

int fcntl(int fd, int cmd,...);

cmd引數:指定執行何種型別的操作,根據型別的不同,可能會有第三個引數 arg 。

在網路程式設計中,fcntl 函式通常用來將乙個檔案描述符設定為非阻塞的。

網路程式設計教程(五)高階I O函式

用於建立檔案描述符的函式,包括pipe dup dup2函式。用於讀寫資料的函式,包括readv writev sendfile mmap munmap splice和tee函式。用於控制i o行為和屬性的函式,包括fcntl函式。一 用於建立檔案描述符的函式 include int pipe in...

高階I O函式

套接字i o操作上設定超時的方法有以下3種 1.呼叫alarm,在指定超時期滿時產生sigalrm訊號。2.在select種阻塞等待i o,一次代替直接阻塞在read或write呼叫上。3.使用較新的so rcvtimeo和so sndtimeo套接字選項。以由呼叫者指定的超時上限呼叫connect...

高階I O函式

include intpipe int fd 2 要想實現雙向的資料傳輸,應該使用兩個管道。管道內部傳輸的資料時位元組流,這和tcp位元組流的概念相同。但tcp寫入多少位元組的資料決定對方的接受視窗和擁塞視窗,而管道本身有乙個容量限制,預設是65536位元組。我們可以使用fcntl函式來修改管道容量...