linux高效能伺服器程式設計第六章(高階I O函式)

2021-10-06 11:33:07 字數 2542 閱讀 2459

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

#include

int dup(int file_descriptor);

int dup2(int file_descriptor_one , int file_descriptor_two);

不繼承原檔案的屬性,如阻塞和非阻塞

用於重定向檔案、管道、網路連線

writev 多個塊整體寫,不用使用memcpy組到一起

readv 分塊讀

struct stat p;

stat("./a" ,&p);

p.st_mode & s_iroth;

sendfile 避免了核心空間和客戶空間之間的資料拷貝,直接進行檔案操作符之間的操作,效率很高,稱為零拷貝。

int connfd = accept(sock,(sockaddr*)&clientaddr , &client_len);

sendfile(connfd,filefd , null , stat_buf.st_size);

專為網路設計,效率變高

mmap的作用是申請一段程序間可以訪問的共享記憶體,munmap的作用是釋放mmap申請的記憶體;

#include

void *mmap(void *start ,size_t length, int port , int flags, int fd ,off_t offset);

int munmap(void *start ,size_t length);

port可選的引數有:

port_read 可讀

port_write 可寫

port_exec  可執行

port_none 不能被訪問

flags可選的引數有:

map_shared 在程序共享這段記憶體。對這段記憶體的修改將被對映到檔案中。提供共享記憶體的posix方法

map_private 記憶體呼叫為私有。這段記憶體的修改不會被對映到檔案中

map_anonymous 這段記憶體不是從檔案對映而來的,內容被初始化為0,。最後兩個引數被忽略

map_fixed 記憶體段必須位於start引數指定的位址,start的長度必須是記憶體頁片的4096倍;

map_hugetlb 按照大頁片分配記憶體空間

0拷貝操作,效率高;

#include

ssize_t splice ( int fd_in ,loff_t * off_in , int fd_out , loff_t off_out , size_t len , usigned int flags);

若 fd_in是管道, off_in = null

若fd_in不是管道,off_in = null ,從輸入資料的當前位置操作

若fd_in不是管道,off_in !=null,從off_in位置操作

flags的可選引數有:

splice_f_move

splice_f_noblock

splice_f_more

splice_f_gift

回射服務關鍵**:

......

int pipefd[2];

ret = pipe(pipefd);

ret = splice(connfd,null, pipefd[1],null,32768,splice_f_more | splice_f_move);

ret = splice(pipefd[0],null,connfd,null , 32768,splice_f_more | splice_f_move);

tee函式在兩個管道檔案描述符之間複製資料,也是零拷貝操作。不消耗資料,tee後還可以繼續接下來的處理

#include

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

#include < fcnlt.h>

int fcnlt(int fd , int cmd , ...)

cmd的可選值為

複製檔案操作描述符:

f_dupfd 

f_dupfd_closeexec

獲取和設定檔案操作描述符的標誌:

f_getfd

f_setfd

獲取和設定檔案操作描述符的狀態標誌:

f_setfl

管理訊號:

f_getown

f_setown

f_getsig

f_setsig

操作管道容量:

f_setpipe

f_getpipe

fcnlt的應用,設定非阻塞;

int setnonblocking(int fd)

int old_option = fcnlt(fd , f_getfl);

int new_option = old_option | o_nonblock;

fcnlt(fd , f_setfl , new_option);

return new_option;

}

linux高效能伺服器程式設計

linux高效能伺服器程式設計 當當網 亞馬遜 目錄 第一章 tcp ip協議族 第二章 ip協議族 第三章 tcp協議詳解 第四章 tcp ip通訊案例 訪問internet 第五章 linux網路程式設計基礎api 第六章 高階io函式 第七章 linux伺服器程式規範 第八章 高效能伺服器框架...

linux 高效能伺服器程式設計

1.高效能定時器 時間輪,時間堆 處理超時時間,如nginx使用紅黑樹,找出最可能超時的事件 2.高效能伺服器程式框架 nginx 使用的是基於事件模型,epoll,不阻塞,非同步處理 兩種高效的事件處理模式 reactor模式 proactor模式 兩種高效的併發模式 半同步 半非同步模式 領導者...

linux高效能伺服器程式設計(1)

linux網路程式設計基礎api 1 socket位址api 2 sockt基礎api sockt的api全部定義在sys socket.h檔案中,包括 建立socket,命名socket,監聽socket,接受連線,發起連線,讀寫資料,獲取位址資訊,檢測帶外標記,以及讀取和設定socket選項。3...