Linux 高級(jí)IO

[TOC]


Linux 高級(jí)IO

涉及到一些IO的高級(jí)用法

文件描述符重定向

dup 函數(shù)從當(dāng)前可用的文件描述符中找一個(gè)最小的返回
dup2 用filedes2指定新文件描述符的值。

#include <unistd.h>
int dup(int filedes);
int dup2(int fileds, int filedes2);
/* 成功則返回新的文件描述符,出錯(cuò)返回-1 */

文件描述符之間傳遞數(shù)據(jù)

sendfile,splice,tee

#include <sys.sendfile.h>
int sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
/* 成功時(shí)返回寫到out_fd的數(shù)據(jù)的字節(jié)數(shù),出錯(cuò)時(shí)返回-1并設(shè)置errno */

參數(shù)如下:

  • out_fd 數(shù)據(jù)將要寫入的那個(gè)文件描述符
  • in_fd 數(shù)據(jù)從這個(gè)描述符取出豌熄,必須是一個(gè)真實(shí)存在的文件涤浇,或者是能夠mmap的設(shè)備
  • offset 從文件的哪里開(kāi)始傳輸
  • count 要傳輸?shù)淖止?jié)數(shù)

對(duì)于像web服務(wù)器這樣的應(yīng)用墩莫,經(jīng)常需要把某個(gè)文件的內(nèi)容傳輸?shù)娇蛻舳私蚧簿褪菍懙脚c客 戶端通信的socket上蠢护,基本的操作類似于這樣:

open source (disk file)
open destination (network connection)
while there is data to be transferred:
    read data from source to a buffer
    write data from buffer to destination
close source and destination

數(shù)據(jù)的讀取和寫入需要調(diào)用read和write系統(tǒng)調(diào)用。 在一個(gè)read系統(tǒng)調(diào)用中箍土,數(shù)據(jù)的傳輸主要經(jīng)過(guò)了如下幾個(gè)路徑:

從硬盤中取出數(shù)據(jù) --傳輸?shù)?-> 內(nèi)核緩沖區(qū) --復(fù)制到--> 程序的緩沖區(qū)

而在write系統(tǒng)調(diào)用中中逢享,數(shù)據(jù)傳輸?shù)穆窂絼t是:

程序的緩沖區(qū) --復(fù)制到--> 內(nèi)核緩沖區(qū) --傳輸?shù)?-> 文件或設(shè)備(比如網(wǎng)卡)

進(jìn)程每次使用系統(tǒng)調(diào)用,都會(huì)出現(xiàn)一次在用戶態(tài)和內(nèi)核態(tài)的上下文切換涮帘,大量的系統(tǒng)調(diào)用 消耗的資源是非称床裕可觀的。為了處理這種情況调缨, sendfile 出現(xiàn)了疮鲫,使用 sendfile 時(shí), 數(shù)據(jù)傳輸?shù)穆窂绞牵?/p>

從硬盤中取出數(shù)據(jù) --傳輸?shù)?-> 內(nèi)核緩沖區(qū) --傳輸?shù)?-> 文件或設(shè)備(比如網(wǎng)卡)

省去了數(shù)據(jù)在內(nèi)核空間和用戶空間的兩次傳輸弦叶,稱為零拷貝

進(jìn)程間傳遞文件描述符

socketpair,使用得Unix原始套接字

由于俊犯,父進(jìn)程中打開(kāi)的文件描述符,在fork調(diào)用之后伤哺,子進(jìn)程中仍然打開(kāi)燕侠,并共享同一個(gè)文件表項(xiàng)。所以立莉,文件描述符可以很方便地從父進(jìn)程傳遞到子進(jìn)程绢彤。

需要注意:傳遞一個(gè)文件描述符并不是傳遞文件描述符的值,而是要在教授進(jìn)程中穿件一個(gè)新的文件描述符蜓耻,并且該文件描述符和發(fā)送進(jìn)程中被傳遞的文件描述符指向內(nèi)核中相同的文件表項(xiàng)茫舶。

那么如何在兩個(gè)不相關(guān)的進(jìn)程間傳遞文件描述符?那就得用到Unix域的原始套接字在進(jìn)程間傳遞特殊的輔助數(shù)據(jù),以實(shí)現(xiàn)文件描述符的傳遞刹淌。

在Linux中使用socketpair函數(shù)創(chuàng)造一對(duì)未命名的饶氏、相互連接的UNIX域套接字。
完全可以把這一對(duì)socket當(dāng)成pipe返回的文件描述符一樣使用有勾,唯一的區(qū)別就是這一對(duì)文件描述符中的任何一個(gè)都可讀和可寫

#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
  • 第1個(gè)參數(shù)domain疹启,表示協(xié)議族,只能為AF_LOCAL或者AF_UNIX蔼卡;
  • 第2個(gè)參數(shù)type喊崖,表示類型,只能為0雇逞。
  • 第3個(gè)參數(shù)protocol荤懂,表示協(xié)議,可以是SOCK_STREAM或者SOCK_DGRAM喝峦。用SOCK_STREAM建立的套接字對(duì)是管道流势誊,與一般的管道相區(qū)別的是呜达,套接字對(duì)建立的通道是雙向的谣蠢,即每一端都可以進(jìn)行讀寫。參數(shù)sv,用于保存建立的套接字對(duì)眉踱。

一次讀多個(gè)緩沖區(qū)

readv和writev函數(shù)用于在一次函數(shù)調(diào)用中讀挤忙、寫多個(gè)非連續(xù)緩沖區(qū)。有時(shí)也將這兩個(gè)函數(shù) 成為 散布讀(scatter read)聚集寫(gather write) 谈喳。如果使用read或者 write册烈,完成同樣的功能需要多次的系統(tǒng)調(diào)用。現(xiàn)在用readv和writev主要調(diào)用一次就OK婿禽。

#include <sys/uio.h>
ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);
ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);
/* 成功時(shí)返回已讀赏僧、寫的字節(jié)數(shù),出錯(cuò)返回-1 */

控制文件描述屬性和行為

fcntl,ioctl

#include <fcntl.h>
int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */ );
/* 成功的返回依賴cmd扭倾,出錯(cuò)返回-1 */

存儲(chǔ)映射IO

存儲(chǔ)映射IO(Memory-mapped IO) 使一個(gè)磁盤文件與存儲(chǔ)空間中的一個(gè)緩沖區(qū)映射淀零。 操作緩沖區(qū)就相當(dāng)于操作磁盤上的文件。 mmap 函數(shù)實(shí)現(xiàn)這個(gè)功能膛壹。

#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flag, int filedes,
           off_t off);
/* 若成功則返回映射區(qū)的起始地址驾中,若出錯(cuò)則返回MAP_FAILED */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市模聋,隨后出現(xiàn)的幾起案子肩民,更是在濱河造成了極大的恐慌,老刑警劉巖链方,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件持痰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侄柔,警方通過(guò)查閱死者的電腦和手機(jī)共啃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)暂题,“玉大人移剪,你說(shuō)我怎么就攤上這事⌒秸撸” “怎么了纵苛?”我有些...
    開(kāi)封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)言津。 經(jīng)常有香客問(wèn)我攻人,道長(zhǎng),這世上最難降的妖魔是什么悬槽? 我笑而不...
    開(kāi)封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任怀吻,我火速辦了婚禮,結(jié)果婚禮上初婆,老公的妹妹穿的比我還像新娘蓬坡。我一直安慰自己猿棉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布屑咳。 她就那樣靜靜地躺著萨赁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兆龙。 梳的紋絲不亂的頭發(fā)上杖爽,一...
    開(kāi)封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音紫皇,去河邊找鬼慰安。 笑死,一個(gè)胖子當(dāng)著我的面吹牛聪铺,可吹牛的內(nèi)容都是我干的泻帮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼计寇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锣杂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起番宁,我...
    開(kāi)封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤元莫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蝶押,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踱蠢,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年棋电,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茎截。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赶盔,死狀恐怖企锌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情于未,我是刑警寧澤撕攒,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站烘浦,受9級(jí)特大地震影響抖坪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闷叉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一擦俐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧握侧,春花似錦蚯瞧、人聲如沸蹬叭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至孽查,卻和暖如春饥悴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盲再。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工西设, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人答朋。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓贷揽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親梦碗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子禽绪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,135評(píng)論 2 34
  • 《UNIX 網(wǎng)絡(luò)編程卷一:套接字聯(lián)網(wǎng)API》筆記 套接字 套接字編程接口,是在 TCP/IP 協(xié)議族中洪规,應(yīng)用層進(jìn)入...
    超net閱讀 5,779評(píng)論 2 13
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理印屁,服務(wù)發(fā)現(xiàn),斷路器斩例,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • 這是Howie-Serious 365日寫作計(jì)劃第030天的寫作內(nèi)容念赶。 任何知識(shí)和技能學(xué)習(xí)础钠,有意識(shí)的重復(fù)訓(xùn)練必不可...
    Howie_Serious閱讀 3,545評(píng)論 5 111
  • 一說(shuō)起汪涵,估計(jì)很多人都喜歡叉谜,我也是其中一個(gè)旗吁。這多半跟他個(gè)人魅力有關(guān)。 對(duì)于他停局,我應(yīng)該是他主持《天天向上》時(shí)喜歡上...
    補(bǔ)拙莫如勤LV閱讀 756評(píng)論 0 5