高階I O函式

2021-10-19 17:42:17 字數 2283 閱讀 7448

#include

intpipe

(int fd[2]

);

要想實現雙向的資料傳輸,應該使用兩個管道。

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

#include

#include

intsocketpair

(int domain,

int type,

int protocol,

int fd[2]

);

domain只能用af_unix,我們只能在本地使用這個雙向管道。

#include

intdup

(int file_descriptor)

;int

dup(

int file_descriptor_one,

int file_descriptor_two)

;

dup函式建立乙個新的檔案描述符,並且與原來file_descriptor檔案描述符指向想通過的檔案或管道或網路連線。並且dup返回的檔案描述符總是取系統當前可用的最小整數值。dup2和dup類似,不會它返回乙個不小於file_descriptor_two的整數值。

dup和dup2並不繼承源有檔案描述符的屬性,如cloexec或noblock等。

利用dup函式實現了乙個基本的cgi伺服器。

先關閉標準輸出檔案描述符stdout_fileno(其值為1).

因為dup總是返回系統最小可用的整數值,則返回1.

這樣以來,伺服器標準輸出的內容會直接傳送到對應的socket上。

int connfd=

accept

(sockfd,

(struct sockaddr*

)&client,

&client_addrlen);if

(connfd<0)

else

senfile函式在兩個檔案描述符之間傳遞資料。完全在核心中操作,從而避免核心緩衝區和使用者緩衝區之間的資料拷貝,這稱為零拷貝。

#include

ssize_t sendfile

(int out_fd,

int in_fd,off_t* offset,size_t count)

;//從in_fd所值的檔案第offset位元組開始讀到out_fd中。

in_fd可以是任何檔案,out_fd必須是乙個socket。(linux核心版本不同,這裡也不同)

splice用於在兩個檔案描述符中之間移動資料,也是零拷貝操作。

#include

ssize_t splice

(int fd_in,loff_t* off_in,

int fd_out,loff_t* off_out,size_t len,

unsigned

int flags)

;//從in_fd所指的檔案第off_in位元組開始讀到out_fd中。

fd_in、fd_out至少有乙個是管道檔案描述符。用splice實現乙個零拷貝的回射伺服器。

整個過程未執行recv/send操作,未涉及使用者空間和核心空間之間的資料拷貝。

tee函式在兩個管道檔案描述符之間複製資料,也是零拷貝操作。它不消耗資料,因此原始檔描述符上的資料仍然可以用於後續的讀操作。

#include

ssize_t tee

(int fd_in,

int fd_out,size_t len,

unsigned

int flags)

;//flags的含義與splice的相同。

利用tee函式和splice函式,實現linux下 同時輸出資料到終端和檔案的程式。(以下檔案是將標準輸出同時輸出到終端和檔案)

高階I O函式

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

高階I O函式之sendfile函式

sendfile函式在兩個檔案描述符之間傳遞資料 完全在核心中操作 從而避免了核心緩衝區和使用者緩衝區之間的資料拷貝,效率很高,被稱為零拷貝。函式定義為 include ssize t senfile int out fd,int in fd,off t offset,size t count in...

Linux 高階I O函式 dup函式

created by wenfan on 2021 2 6.include include include include include include include include include int main int argc,char ar const char ip ar 1 int...