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

2021-08-21 16:59:38 字數 2471 閱讀 1732

用於建立檔案描述符的函式,包括pipe、dup/dup2函式。

用於讀寫資料的函式,包括readv/writev、sendfile、mmap/munmap、splice和tee函式。

用於控制i/o行為和屬性的函式,包括fcntl函式。

一、用於建立檔案描述符的函式

#include int pipe(int fd[2]);

函式功能:

建立乙個管道以實現程序間通訊.

函式引數:

fd:fd[0]只能用於從管道讀出資料,fd[1]則只用於往管道中寫資料,不能反著用.

返回值:

成功時返回0,失敗則返回-1並設定errno.

#include #include int socketpair(int domain, int type, int protocol, int fd[2]);

函式功能:

建立雙向管道.

函式引數:

domain:協議族

type:

protocol:傳輸服務型別

fd:fd[0]/fd[1]既可讀也可寫

#include int dup(int file_descriptor);

函式功能:

重定向檔案

函式引數:

file_descriptor:被重定向的檔案描述符

返回值:

返回新的檔案描述符,總是取系統當前可用的最小整數值

int dup2(int file_descriptor_ont, int file_descriptor_two);

函式功能:

重定向檔案

函式引數:

file_descriptor1:被重定向的檔案描述符

file_descriptor2:檔案描述符的下限

返回值:

返回新的檔案描述符,總是取系統當前不小於file_descriptor_two可用的最小整數值

二、用於讀寫資料的函式

#include ssize_t read_v(int fd, const struct iovec *vector, int count);

ssize_t write_v(int fd, const struct iovec *vector, int count);

readv函式將資料從檔案描述符讀到分散的記憶體塊中,即分散讀;

writev函式則將多塊分散的記憶體資料一併寫入檔案描述符中,即集中寫。

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

函式功能:

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

函式引數:

out_fd:待寫入內容的檔案描述符

in_fd :待讀出內容的檔案描述符

offset:指定從讀入檔案流的哪個位置開始讀

count :傳輸的位元組數

返回值:

sendfile成功時返回傳輸的位元組數,失敗則返回-1並設定errno.

注:in_fd必須指向真實的檔案,out_fd必須是乙個socket檔案描述符。sendfile是乙個專門為網路上傳輸檔案而設計的系統呼叫。

#include void* mmap(void *start, size_t length, int prot, int flags, int fd);

函式功能:

申請一段記憶體空間,可作為程序間通訊的共享記憶體。

函式引數:

start:起始位址,若設定為null,則系統自動分配乙個位址。

length:指定記憶體段的長度

prot:記憶體段的訪問許可權,可讀、可寫、可執行或不能被訪問

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

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

返回值:

mmap函式成功時返回指向目標記憶體區域的指標,失敗則返回map_failed並設定errno.

int munmap(void *start, size_t length);

函式功能:

用於釋放由mmap建立的這段記憶體空間。

#include ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);

函式功能:

在兩個管道檔案描述符之間複製資料,也是零拷貝操作。

三、用於控制i/o行為和屬性的函式

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

函式功能:

對檔案描述符進行各種控制操作

函式引數:

fd:備操作的檔案描述符

cmd:指定執行何種型別的操作。常用操作有

返回值:

失敗時返回-1並設定errno.

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

pipe 函式用於建立乙個管道,以實現程序間通訊。include int pipe int fd 2 引數是乙個包含兩個 int 型整數的陣列指標。成功 返回 0 並將一對開啟的檔案描述符值傳入陣列中。失敗 返回 1,並設定errno。通過 pipe 函式建立的兩個檔案描述符 fd 0 和 fd 1...

網路程式設計常用I O函式

read write readv writev 對資料進行整合傳輪及傳送的函式。也就是說,通過writev 函式可以將分散儲存在多個緩衝中的資料一併傳送,通過readv函式可以由多個緩衝分別接收。因此,適當使用這2個函式可以減少i o函式的呼叫次數。下面先介紹writev 函式。include ss...

高階I O函式

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