阻塞io,
當前程序因不滿足一些條件,而被掛起,即阻塞,cpu改去服務其它程序,
read乙個普通檔案,就馬上執行,read乙個滑鼠,可是滑鼠沒有動,於是就阻塞了,
阻塞的好處,
利於os效能的發揮,cpu發揮高,雖然個體的費了點時間,但是總的效率得到了提高,
阻塞在多路io的時候,缺陷就出來了,比如2路io分別要讀鍵盤和滑鼠,阻塞在滑鼠,可是滑鼠沒動,然後鍵盤輸入也沒用,
非阻塞io,如果涉及多路io,最好就不要用阻塞io,
預設都是阻塞方式,
實現非阻塞,
1,開啟檔案o_nonblock,
2,fcntl函式,
讀取鍵盤,標準輸入,stdin,0,預設就是開啟的,
read( 0, buf, 2 );
讀取滑鼠,
int fd = -1;
fd = open( 「/dev/input/mouse1」, o_rdonly );
read( fd, buf, 5 );
同時讀取鍵盤和滑鼠,
由於讀取2者,都是阻塞方式的,
而且程式中有固有的先後順序,我們需要配合,比如先動滑鼠,然後動鍵盤,
阻塞有它的好處,也有它的不便之處,
#include
#include
#include
#include
#include
#include
int main(void)
memset(buf, 0, sizeof(buf));
printf("before 滑鼠 read.\n");
read(fd, buf, 50);
printf("滑鼠讀出的內容是:[%s].\n", buf);
// 讀鍵盤
memset(buf, 0, sizeof(buf));
printf("before 鍵盤 read.\n");
read(0, buf, 5);
printf("鍵盤讀出的內容是:[%s].\n", buf);
return
0;
}
非阻塞io,如果沒有讀到東西,就立即返回,
改變標準輸入為非阻塞式的,
flag = fcntl( 0, f_getfl );
flag |= o_nonblock;
fcntl( 0, f_setfl, flag );
非阻塞開啟滑鼠,
fd = open( 「/dev/input/mouse1」, o_rdonly | o_nonblock );
然後出現了一種結果,
從滑鼠和鍵盤所讀出的內容都是空的,因為來不及輸入,
接著,做了一種改變,
把讀滑鼠和鍵盤放到乙個while(1)中,
經過這次修改,結果看起來舒服多了
#include
#include
#include
#include
#include
#include
int main(void)
// 把0號檔案描述符(stdin)變成非阻塞式的
flag = fcntl(0, f_getfl); // 先獲取原來的flag
flag |= o_nonblock; // 新增非阻塞屬性
fcntl(0, f_setfl, flag); // 更新flag
// 這3步之後,0就變成了非阻塞式的了
while (1)
// 讀鍵盤
memset(buf, 0, sizeof(buf));
//printf("before 鍵盤 read.\n");
ret = read(0, buf, 5);
if (ret > 0)
} return
0;
}
常見的阻塞:wait、pause、sleep等函式;read或write某些檔案時常見的阻塞:wait、pause、sleep等函式,它們本身就是阻塞的,
read或write阻塞與否,看你操作的物件是誰,
#include
#include
#include
#include
#include
#include
#include
#include
int main(void)
// 當前有2個fd,一共是fd乙個是0
// 處理myset
fd_zero(&myset);
fd_set(fd, &myset);
fd_set(0, &myset);
tm.tv_sec = 10;
tm.tv_usec = 0;
ret = select(fd+1, &myset, null, null, &tm);
if (ret < 0)
else
if (ret == 0)
else
if (fd_isset(fd, &myset))
} return
0;
}
這個是poll的示例**
#include
#include
#include
#include
#include
#include
#include
int main(void)
; fd = open("/dev/input/mouse1", o_rdonly);
if (fd < 0)
// 初始化我們的pollfd
myfds[0].fd = 0; // 鍵盤
myfds[0].events = pollin; // 等待讀操作
myfds[1].fd = fd; // 滑鼠
myfds[1].events = pollin; // 等待讀操作
ret = poll(myfds, fd+1, 10000);
if (ret < 0)
else
if (ret == 0)
else
if (myfds[1].events == myfds[1].revents)
} return
0;
}
非阻塞IO與阻塞IO
非阻塞式呼叫的問題 kibuv提供了乙個執行緒池 阻塞於非阻塞對於被呼叫者,即系統層面,系統為程式提供了阻塞呼叫和非阻塞呼叫,同步和非同步是對於呼叫者,就是自己的程式,發七呼叫,沒有其他操作,只是等待結果這個過程就是同步,發起呼叫後會等待結果,繼續完成其他的工作,等有回掉再執行,這個過程就是非同步的...
阻塞I O,非阻塞I O
拿 socket舉例。當read資料時,如果這時沒有資料可讀,阻塞i o會一直等待有資料讀,資料從kernel copy 到socket的buffer後返回 非阻塞i o會立即返回,但如果有資料可讀,非阻塞i o也是等資料從kernel copy 到socket的buffer後返回。以上是阻塞與非阻...
阻塞與非阻塞I O
還記得上篇 我們講到的是linux中併發控制訪問的手段有哪些?原子 訊號量 自旋鎖 互斥體。這是為了保護臨界區的資源,是多個程序對共享資源的併發訪問的一種處理手段。但是,在驅動程式中,我們常常為了支援使用者空間對裝置的靈活訪問,引入了阻塞與非阻塞i o兩種不同模式。阻塞操作是指在執行裝置操作時若不能...