什么是阻塞和非阻塞?我們就用管道的讀寫(xiě)來(lái)舉例子。
如果沒(méi)聽(tīng)過(guò)管道,就把他理解成文件就行。
一個(gè)程序打開(kāi)管道,并且往管道里面寫(xiě)入數(shù)據(jù);
intmain() { intfd=open("fifo",O_WRONLY); if (-1 == fd) { perror("open"); } char buf[32] = {0}; scanf("%s", buf); if (write(fd, buf, strlen(buf)) == -1) { perror("write"); } return 0; }另一個(gè)程序打開(kāi)管道,從管道里面讀取數(shù)據(jù)。
int main() { intfd=open("fifo",O_RDONLY); if (-1 == fd) { perror("open"); } charbuf[32]={0}; if (read(fd, buf, sizeof(buf)) == -1) { perror("write"); } return 0; }默認(rèn)情況下,用open打開(kāi)管道是阻塞的模式,也就是說(shuō),如果管道沒(méi)有數(shù)據(jù),程序一直停在 read 函數(shù)這里,直到管道里面有數(shù)據(jù),把它讀出來(lái)。
創(chuàng)建一個(gè)管道,運(yùn)行程序,現(xiàn)象就是這樣的,程序此時(shí)阻塞在 read 函數(shù)。
如果通過(guò)寫(xiě)進(jìn)程往管道里面寫(xiě)入數(shù)據(jù),read能立馬把數(shù)據(jù)讀出來(lái)。
open函數(shù)還給我們提供了非阻塞的模式,加上這個(gè)選項(xiàng),運(yùn)行程序的時(shí)候,即使管道里面沒(méi)有數(shù)據(jù),程序也不會(huì)停在 read 函數(shù)上,繼續(xù)向下執(zhí)行。
這兩個(gè)現(xiàn)象,就是阻塞和非阻塞。
最后,放上百科的一段解釋?zhuān)蠹疫€有什么見(jiàn)解,歡迎在評(píng)論區(qū)交流。
阻塞和非阻塞指的是調(diào)用者(程序)在等待返回結(jié)果(或輸入)時(shí)的狀態(tài)。 阻塞時(shí),在調(diào)用結(jié)果返回前,當(dāng)前線(xiàn)程會(huì)被掛起,并在得到結(jié)果之后返回。 非阻塞時(shí),如果不能立刻得到結(jié)果,則該調(diào)用者不會(huì)阻塞當(dāng)前線(xiàn)程。 因此對(duì)應(yīng)非阻塞的情況,調(diào)用者需要定時(shí)輪詢(xún)查看處理狀態(tài)。
審核編輯:劉清
-
阻塞
+關(guān)注
關(guān)注
0文章
24瀏覽量
8083
原文標(biāo)題:什么是阻塞和非阻塞
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論