unix/linux下主要的4種i/o模型:1,阻塞i/o:
最常用,最簡單,效率最低
2,非阻塞i/o:
可防止程序阻塞在i/o操作上,需要輪詢。
3,i/o多路復用:
允許同時對多個i/o進行控制
4,訊號驅動i/o:
一種非同步通訊模型。
阻塞i/o模式:
阻塞i/o是最普遍使用的i/o模式,大部分的程式使用的都是阻塞i/o。
預設的情況下,套按字建立以後所處於的模式就是阻塞i/o模式。
例如:讀操作read,recv,recvfrom
寫操作:write,send
其他操作:accept,connect
讀阻塞:程序呼叫read函式從套接字中讀取資料,當套接字中緩衝區中沒有要讀的資料,函式會阻塞。
它會一直阻塞下去,等待套接字的接收緩衝區中有資料可讀
經過一段的時間後,緩衝區中接收到資料,於是核心便去喚醒該程序,通過read訪問這些資料。
如果在程序阻塞過程中,對方發生故障,那這個程序將永遠阻塞下去。
寫阻塞:在寫操作上發生阻塞的情況比較少,主要發生在要寫入的緩衝區的大小小於要寫入的的資料量的情況下。
這時,寫操作不進行任何的拷貝工作,將發生阻塞,一旦緩衝區有足夠的空間,核心將喚醒程序,將資料從使用者緩衝 拷
貝到相應的傳送緩衝區中
特例:udpi不用等待使用者的確認,沒有實際的傳送緩衝區,所以udp協議中不存在傳送緩衝區滿的情況,在udp套接字上 執 行的寫操作將永遠不會阻塞。
非阻塞i/o:
於阻塞i/o相反,程序不會睡眠,立即返回乙個錯誤的資訊,這樣需要不停的查詢(polling),浪費cpu的資源操作。
多路復用i/o:
先構造一張有關的描述符表,然後呼叫乙個函式。當這些檔案描述符表中的乙個或多個已準備好進行i/o時函式才返回。 函式返回時告訴程序那個描述符準備就緒了,可以進行i/o操作了。
訊號驅動i/o:是一種非同步通訊模式,相當於中斷。
多路復用i/o來實現併發伺服器:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define n 64
typedef struct sockaddr sa;
int main(int argc, char *argv)
bzero(&myaddr, sizeof(myaddr));
myaddr.sin_family = pf_inet;
myaddr.sin_port = htons(8001);
myaddr.sin_addr.s_addr = inet_addr("192.168.1.15");
if (bind(listenfd, (sa *)&myaddr, sizeof(myaddr)) < 0)
listen(listenfd, 5);
maxfd = listenfd;
fd_zero(&rdfs);
fd_set(listenfd, &rdfs);
//select的第乙個引數為最大檔案描述符加1,
while ( 1 )
for(i=0; i<=maxfd; i++)
else
else}}
} // end for
} // end while
return 0;
}
UNIX LINUX下 M 的問題
unix和windows間的文字檔案轉換 在用電報通訊的年代,人們發明了一種用7bits把常用的英文和標點編碼的方法 這就是至今還在計算機世界應用的ascii。電報機每當列印到一行結尾時便需要 跳進下一行 並 回到第一格 因此ascii有lf line feed,0 0a 和cr carriage ...
設定 Unix,Linux環境下的NLS LANG
設定 nls lang 變數 1 正確配置 lc all 引數 2 配置 telnet ssh securecrt 客戶端的字符集 linux中可以用locale命令來檢視 nls lang設定,如下例所示 root hxzg locale lang en us.utf 8 lc ctype en ...
Unix Linux下的Shell命令解釋程式
unix的shell是作為作業系統的最外層,也稱外殼。它有以下幾種身份 作為命令語言 為使用者提供使用作業系統的介面,使用者利用該介面與機器互動 作為程式語言 使用者可以利用多條shell命令構成乙個檔案,稱為shell檔案或shell過程 作為shell命令解釋程式 用於對從標準輸入或檔案中讀入的...