#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...