Linux-IO函數(shù)

數(shù)據(jù)的IO和復(fù)用

網(wǎng)絡(luò)數(shù)據(jù)能夠正常的到達(dá)用戶膝昆,并被用戶接受網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)哪康耐璞摺>W(wǎng)絡(luò)數(shù)據(jù)的接受以及發(fā)送有多種方案,例如直接接受或者發(fā)送數(shù)據(jù)通過(guò)向量發(fā)送接受數(shù)據(jù)荚孵,通過(guò)消息進(jìn)行接受以及發(fā)送妹窖。

1.介紹主要的常用的IO函數(shù)

2。介紹幾種常用的IO模型

3 介紹select和pselect函數(shù)收叶,如何利用這兩個(gè)文件的描述符號(hào)進(jìn)行文件讀寫(xiě)描述符的監(jiān)視骄呼。

4.簡(jiǎn)單的介紹函數(shù)poll和ppoll含義使用以及區(qū)別

5 以簡(jiǎn)單的例子介紹非堵塞編程。

--------------------------------------------------? ? ?IO 函數(shù)? ? -----------------------------------------------

recv函數(shù)用于接受數(shù)據(jù),函數(shù)的原型如下蜓萄。recv函數(shù)從套接字s中接受數(shù)據(jù)放到緩沖區(qū)buf中隅茎,buf的長(zhǎng)度為len,操作的方式由flag決定嫉沽。第一個(gè)參數(shù)s是套接字文件的描述符辟犀,它是由函數(shù)socket()返回的,第二個(gè)參數(shù)buf是一個(gè)指針绸硕,指向接受網(wǎng)絡(luò)套接字的緩沖區(qū)堂竟,第三個(gè)參數(shù)表示緩沖區(qū)的大小,以字節(jié)為單位臣咖。



#include <sys/type.h>

#include <sys/socket.h>

ssize_t recv(int s,void * buf,size_t len,int flags);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?flags的值以及含義

MSG_DONTWAIT? ? ? ? ? ? ? ? ? ? 非阻賽的操作跃捣,立刻返回不等待

MSG_ERRQUEUE? ? ? ? ? ? ? ? ? ?錯(cuò)誤消息從套接字錯(cuò)誤隊(duì)列接收

MSG_OOB? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 接收外數(shù)據(jù)數(shù)據(jù)

MSG_PEEK? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?查看數(shù)據(jù),不進(jìn)行數(shù)據(jù)緩沖區(qū)的清空

MSG_TRUNC? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回所有的數(shù)據(jù)夺蛇,及時(shí)指定緩沖區(qū)過(guò)小

MSG_WAITALL? ? ? ? ? ? ? ? ? ? ? ? ? 等待所有的消息

MSG_DONTWAIT:這個(gè)標(biāo)志將單個(gè)IO操作設(shè)為非堵塞方式疚漆,而不需要在套接字上打開(kāi)非堵塞的標(biāo)志,執(zhí)行IO操作刁赦。然后關(guān)閉非堵塞的標(biāo)志娶聘。

MSG_ERRQUEUE:? 改錯(cuò)誤的傳輸依賴于所使用的協(xié)議。

MSG_OOB :這個(gè)標(biāo)志可以接收帶外數(shù)據(jù)甚脉,而不接收一般的數(shù)據(jù)丸升。

MSG_PEEK : 這個(gè)標(biāo)志用于查看可讀數(shù)據(jù),在recv函數(shù)執(zhí)行后牺氨,內(nèi)核不會(huì)將這些數(shù)據(jù)丟棄掉狡耻。

MSG_TRUNC: 在接收數(shù)據(jù)后,如果用戶的緩沖區(qū)大小不足以完全復(fù)制緩沖區(qū)的數(shù)據(jù)猴凹,則將數(shù)據(jù)折斷夷狰,僅復(fù)制用戶緩沖區(qū)大小的數(shù)據(jù),多余的數(shù)據(jù)將會(huì)舍棄掉郊霎。

MSG_WAITALL:這個(gè)標(biāo)志告訴內(nèi)核在沒(méi)有讀到請(qǐng)求的字節(jié)數(shù)之前不使讀操作返回沼头。如果系統(tǒng)支持使用這個(gè)標(biāo)志,可以去掉readn()函數(shù)而使用下面的代替

#define readn(fd,ptr,n) recv(fd,ptr,n,MSG_WAITALL)

即使設(shè)置MSG_WAITALL书劝,如果發(fā)生以下情況(a)捕獲一個(gè)信號(hào)(b)連接終止(c)在套接字上發(fā)生了錯(cuò)誤进倍,這個(gè)函數(shù)返回的字節(jié)數(shù)依然會(huì)比請(qǐng)求的少。當(dāng)指定MSG_WAITALL標(biāo)志時(shí)购对,函數(shù)會(huì)復(fù)制與用戶指定長(zhǎng)度相等的數(shù)據(jù)猾昆。如果內(nèi)核中的當(dāng)前數(shù)據(jù)不能滿足要求,會(huì)一直等待直到數(shù)據(jù)足夠才返回骡苞。

函數(shù)recv()的返回值是成功接收到的字節(jié)數(shù)垂蜗。當(dāng)返回-1時(shí)錯(cuò)誤發(fā)生坑赡,可以查看errno獲取錯(cuò)誤碼,當(dāng)另一個(gè)訪民啊使用close()關(guān)閉連接時(shí)么抗,返回值為0;

常見(jiàn)的錯(cuò)誤碼如下:

EAGAIN? ? ? ? ? 套接字定義為非堵塞亚铁,而操作采用了堵塞的方式蝇刀,或者定義的超時(shí)時(shí)間已經(jīng)達(dá)到卻沒(méi)有接收到數(shù)據(jù)。

EBADF? ?參數(shù)s不是合法的描述符

ECONNREFUSED? 遠(yuǎn)程主機(jī)不允許此操作

EFAULT? 接受緩沖區(qū)指針在此進(jìn)程之外

EINTR? ? ? 接收到中斷信號(hào)

EINTVAl? ?傳遞了不合法的參數(shù)

ENOTCONN? ?套接字s表示流式套接字徘溢,此套接字沒(méi)有連接吞琐。

ENOTSOCK? ?參數(shù)不是套接字描述符

recv()函數(shù)通常用于TCP類(lèi)型的套接字。UDP使用recvfrom()函數(shù)接受數(shù)據(jù)然爆,當(dāng)然在數(shù)據(jù)包套接字綁定地址一節(jié)端口號(hào)后站粟,也可以使用recv()接受數(shù)據(jù)。

recv()函數(shù) 從內(nèi)核的接收緩沖區(qū)復(fù)制到數(shù)據(jù)到用戶指定的緩沖區(qū)曾雕。當(dāng)內(nèi)核的緩沖區(qū)比指定的緩沖區(qū)小時(shí)奴烙,一般情況下(沒(méi)有采用MSG_WAITALL標(biāo)志)會(huì)復(fù)制緩沖區(qū)的所有的數(shù)據(jù)到用戶緩存區(qū)。并返回?cái)?shù)據(jù)的長(zhǎng)度剖张。當(dāng)內(nèi)核的接收的緩沖區(qū)的數(shù)據(jù)比用戶指定的多時(shí)切诀,會(huì)將用戶指定長(zhǎng)度的len的接收緩沖區(qū)的數(shù)據(jù)復(fù)制到用戶指定地址。其余的數(shù)據(jù)需要下次調(diào)用該函數(shù)時(shí)在復(fù)制搔弄,內(nèi)核在復(fù)制用戶指定的數(shù)據(jù)之后幅虑,會(huì)銷(xiāo)毀已經(jīng)復(fù)制完畢的數(shù)據(jù),并進(jìn)行調(diào)整顾犹。

使用send()函數(shù)發(fā)送數(shù)據(jù)

send()函數(shù)用于發(fā)送數(shù)據(jù)倒庵,函數(shù)的原型如下

#include<sys/types.h>

#include <sys/socket.h>

ssize_t send(int s,const void * buf,size_t len,int flags)

send()函數(shù)將緩沖區(qū)buf大小為len的數(shù)據(jù)。通過(guò)套接字文件描述符按照f(shuō)lags指定的方式發(fā)送出去炫刷,其中的參數(shù)含義與recv中的含義一致擎宝,它的返回值是成功的字節(jié)數(shù),用于用戶的緩沖區(qū)buf中的數(shù)據(jù)在通過(guò)send()函數(shù)進(jìn)行發(fā)送的時(shí)候柬唯,并不一定能夠全部發(fā)送出去认臊,所以要檢查send() 函數(shù)的返回值,按照與計(jì)劃發(fā)送的字節(jié)長(zhǎng)度是否相等來(lái)判斷下一步的操作锄奢。

當(dāng)send()函數(shù)的返回值小于len的時(shí)候失晴,表明緩沖區(qū)仍然由部分?jǐn)?shù)據(jù)沒(méi)有成功的發(fā)送,這時(shí)需要重新發(fā)送剩余的部分拘央,通常剩余數(shù)據(jù)發(fā)送的方法是對(duì)原來(lái)的buf中的數(shù)據(jù)位置進(jìn)行偏移涂屁,偏移的大小為已經(jīng)成功發(fā)送的字節(jié)數(shù)。

send 函數(shù)錯(cuò)誤嗎如下:

函數(shù)send()只能用于套接字處于連接狀態(tài)的描述符灰伟,之前必須使用connect()函數(shù)或者其它函數(shù)進(jìn)行連接拆又。對(duì)于send()函數(shù)和write()函數(shù)之間的差別表示發(fā)送方式的flag儒旬,當(dāng)flag為0時(shí),send()函數(shù)和write()函數(shù)完全一致帖族,而且send(s,buf,len,flags)與sendto(s,buf,len,flags,NULL,0)等價(jià)的栈源。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市竖般,隨后出現(xiàn)的幾起案子甚垦,更是在濱河造成了極大的恐慌,老刑警劉巖涣雕,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艰亮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挣郭,警方通過(guò)查閱死者的電腦和手機(jī)迄埃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兑障,“玉大人侄非,你說(shuō)我怎么就攤上這事×饕耄” “怎么了彩库?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)先蒋。 經(jīng)常有香客問(wèn)我骇钦,道長(zhǎng),這世上最難降的妖魔是什么竞漾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任眯搭,我火速辦了婚禮,結(jié)果婚禮上业岁,老公的妹妹穿的比我還像新娘鳞仙。我一直安慰自己,他們只是感情好笔时,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布棍好。 她就那樣靜靜地躺著,像睡著了一般允耿。 火紅的嫁衣襯著肌膚如雪借笙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天较锡,我揣著相機(jī)與錄音业稼,去河邊找鬼。 笑死蚂蕴,一個(gè)胖子當(dāng)著我的面吹牛低散,可吹牛的內(nèi)容都是我干的俯邓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼熔号,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稽鞭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起引镊,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤川慌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后祠乃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兑燥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年亮瓷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片降瞳。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘱支,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挣饥,到底是詐尸還是另有隱情除师,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布扔枫,位于F島的核電站汛聚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏短荐。R本人自食惡果不足惜倚舀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忍宋。 院中可真熱鬧痕貌,春花似錦、人聲如沸糠排。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)入宦。三九已至哺徊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乾闰,已是汗流浹背唉工。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汹忠,地道東北人淋硝。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓雹熬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谣膳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竿报,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫(xiě)完項(xiàng)目接著寫(xiě)寫(xiě)一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,579評(píng)論 1 118
  • socket通信原理 socket又被叫做套接字,它就像連接到兩端的插座孔一樣,通過(guò)建立管道,將兩個(gè)不同的進(jìn)程之間...
    jiodg45閱讀 1,141評(píng)論 0 1
  • 1.send 函數(shù) intsend(SOCKETs, constcharFAR*buf, intlen, intf...
    踩在浪花上00閱讀 4,328評(píng)論 0 1
  • 網(wǎng)絡(luò)模型 物理層 物理層表示的是比特流傳輸继谚,通常包括串口/COM口烈菌、并行/LPT口、USB花履、網(wǎng)線接口芽世、電話線接口;...
    秋風(fēng)弄影閱讀 715評(píng)論 0 2
  • 404頁(yè)面為何會(huì)出現(xiàn):當(dāng)用戶輸入了錯(cuò)誤的鏈接時(shí)诡壁,返回的頁(yè)面济瓢,以及頁(yè)面內(nèi)容已被刪除,找不到原來(lái)頁(yè)面妹卿。 404頁(yè)面的目...
    宛平閱讀 278評(píng)論 0 0