日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux高性能server编程——高级I/O函数

發(fā)布時間:2024/4/13 linux 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux高性能server编程——高级I/O函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


高級I/O函數(shù)

pipe函數(shù)

pipe函數(shù)用于創(chuàng)建一個管道,實(shí)現(xiàn)進(jìn)程間的通信。

#include <unistd.h>

int pipe(int pipefd[2]);

通過pipe函數(shù)創(chuàng)建的文件描寫敘述符fd[0]fd[1]分別構(gòu)成管道的兩端,往fd[1]寫入的數(shù)據(jù)能夠從fd[0]讀出,不能反過來。管道內(nèi)部傳輸?shù)臄?shù)據(jù)時字節(jié)流,和TCP字節(jié)流概念同樣,但有差別,管道本身擁有一個容量限制,它規(guī)定假設(shè)應(yīng)用程序不將數(shù)據(jù)從管道讀走的話,該管道最多能被寫入多少字節(jié)的數(shù)據(jù)。管道容量阿東小默認(rèn)是65536字節(jié),能夠用fcntl函數(shù)來改動管道容量。

此外,socket基礎(chǔ)API中有一個socketpair函數(shù),可以方便創(chuàng)建雙向管道。

#include<sys/types.h>?????????/* See NOTES*/

#include<sys/socket.h>

intsocketpair(int domain, int type, int protocol, int sv[2]);

這里domain僅僅能使用UNIX本地域協(xié)議族AF_UNIX,由于我們僅能在本地使用這個雙向管道。

dup函數(shù)和dup2函數(shù)

#include <unistd.h>

int dup(int oldfd);

int dup2(int oldfd, int newfd);

dup函數(shù)創(chuàng)建一個新的文件描寫敘述符,該新的文件描寫敘述符和原有的文件描寫敘述符file_descriptor指向同樣的文件、管道或網(wǎng)絡(luò)連接。而且dup返回的文件描寫敘述符總是取系統(tǒng)當(dāng)前可用的最小整數(shù)值。Dup2dup類型,只是它將返回第一個不小于newfd的整數(shù)值。dupdup2系統(tǒng)調(diào)用失敗時返回-1并設(shè)置errno

通過dupdup2創(chuàng)建的文件描寫敘述符并不繼承原文件描寫敘述符的屬性。

readv函數(shù)和writev函數(shù)

readv函數(shù)將數(shù)據(jù)從文件描寫敘述符督導(dǎo)分散的內(nèi)存塊中,即分散讀。Writev函數(shù)則將多塊分散的內(nèi)存數(shù)據(jù)一并寫入文件描寫敘述符中,即集中寫。定義例如以下:

#include <sys/uio.h>

ssize_t readv(int fd, const struct iovec*iov, int iovcnt);

ssize_t writev(int fd, const struct iovec*iov, int iovcnt);

fd是文件描寫敘述符,ioviovec結(jié)構(gòu)數(shù)組,該結(jié)構(gòu)體描寫敘述一塊內(nèi)存區(qū),iovcnt參數(shù)是數(shù)組的長度。

sendfile函數(shù)

sendfile函數(shù)在兩個文件描寫敘述符之間直接傳遞數(shù)據(jù)(全然在內(nèi)核中操作),從而避免了內(nèi)核緩沖區(qū)和用戶緩沖區(qū)之間的數(shù)據(jù)拷貝,效率高,這被稱為零拷貝。

#include <sys/sendfile.h>

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

in_fd參數(shù)是帶讀出內(nèi)容的文件描寫敘述符,out_fd參數(shù)是帶寫入內(nèi)容的文件描寫敘述符,offset參數(shù)指定從讀入文件流的哪個位置開始讀,count指定文件描寫敘述符in_fdout_fd之間傳輸?shù)淖止?jié)數(shù)。

mmap函數(shù)和munmap函數(shù)

mmap函數(shù)用于申請一段內(nèi)存空間。我們能夠?qū)⑦@段內(nèi)存作為進(jìn)程通信的共享內(nèi)存,也能夠?qū)⑽募苯佑成涞疆?dāng)中。Munmap函數(shù)則釋放由mmap創(chuàng)建的這段內(nèi)存空間。定義例如以下:

#include <sys/mman.h>

void *mmap(void *addr, size_t length, intprot, int flags, int fd, off_t offset);

int munmap(void *addr, size_t length);

當(dāng)中,start參數(shù)同意用于使用某個特定的地址作為這段內(nèi)存的起始地址。假設(shè)被設(shè)置成NULL,則系統(tǒng)自己主動分配一個地址。Length參數(shù)指定內(nèi)存段的長度。Port參數(shù)用來設(shè)置內(nèi)存段的訪問權(quán)限,flag參數(shù)控制內(nèi)存段被改動后程序的行為。Fd參數(shù)是被映射文件相應(yīng)的文件描寫敘述符。Mmap函數(shù)成功時返回指向目標(biāo)內(nèi)存區(qū)域的指針,失敗則返回MAP_FAILED,并設(shè)置errno

splice函數(shù)

#include <fcntl.h>

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

用來控制兩個文件描寫敘述符之間的數(shù)據(jù)移動,也是零拷貝操作。Flag參數(shù)控制數(shù)據(jù)流怎樣移動。

tee函數(shù)

tee函數(shù)在兩個管道文件描寫敘述符之間復(fù)制數(shù)據(jù),也是零拷貝操作。它不消耗數(shù)據(jù),因此源文件描寫敘述符上的數(shù)據(jù)仍然能夠用于興許的讀操作。Tee函數(shù)的原型例如以下:

#define _GNU_SOURCE????????/* See feature_test_macros(7) */

#include <fcntl.h>

ssize_t tee(int fd_in, int fd_out, size_tlen, unsigned int flags);

fcntl函數(shù)

fcntl函數(shù)提供了對文件描寫敘述符的各種控制操作。另外一個常見的控制文件描寫敘述符屬性和行為的系統(tǒng)調(diào)用時ioctl,并且ioctlfcntl可以運(yùn)行很多其它的控制。

總結(jié)

以上是生活随笔為你收集整理的Linux高性能server编程——高级I/O函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。