multiplex_select.c
#include
#include
#include
#include
#include
#include
#define max_buffer_size 1024
#define in_files 3
#define time_delay 60
#define max(a, b) ((a > b)?(a):(b))
intmain
(void)if
((fds[2]
= open (
"in2"
, o_rdonly|o_nonblock)
)<0)
maxfd =
max(
max(fds[0]
, fds[1]
), fds[2]
);fd_zero
(&inset)
;for
(i =
0; i < in_files; i++
)fd_set(0
,&inset)
; tv.tv_sec = time_delay;
tv.tv_usec =0;
while
(fd_isset
(fds[0]
,&inset)
||fd_isset
(fds[1]
,&inset)
||fd_isset
(fds[2]
,&inset)
)break
;case0:
/* timeout */
break
;default:}
elseif(
!real_read)
else
}else}}
/* end of if */
}/* end of for */
}break;}
/* end of switch */
}/*end of while */
return0;
}
multiplex_poll.c
#include
#include
#include
#include
#include
#include
#include
#include
#define max_buffer_size 1024
/* 緩衝區大小*/
#define in_files 3
/* 多路復用輸入檔案數目*/
#define time_delay 60
/* 超時時間秒數 */
#define max(a, b) ((a > b)?(a):(b))
intmain
(void)if
((fds[2]
.fd = open (
"in2"
, o_rdonly|o_nonblock)
)<0)
for(i =
0; i < in_files; i++
)/*迴圈測試該檔案描述符是否準備就緒,並呼叫 select 函式對相關檔案描述符做對應
操作*/
while
(fds[0]
.events || fds[1]
.events || fds[2]
.events)
for(i =
0; i< in_files; i++)}
elseif(
!real_read)
else
}else
}/* end of if real_read*/
}/* end of if revents */
}/* end of for */
}/*end of while */
exit(0);}
執行過程:開啟三個終端,首先在兩個終端裡分別建立兩個通道in1和in2
mknod in1 p
mknod in2 p
此時,在第三個終端中執行select()或poll()
執行結果展示:
主程式處會逐條顯示出你輸入在管道內的字串
在select()中,當三個終端都處於無輸入狀態時,持續到超過時間值(本程式為60s),則主程式會主動退出。
在poll()中,當三個終端都處於無輸入狀態時,主程式會一直等待。
相較於select(),poll()會具有更高的執行效率,在管道內輸入字串時就能夠體會到。
多路復用select與poll
華清遠見嵌入式學院 講師。在unix linux中有4中io模型,分別為 1 阻塞io 2 非阻塞io 3 io多路復用 4 訊號驅動io 這幾種io模型,阻塞io是最長用到的,並且操作相對簡單,但是缺點在於效率低下,尤其是在,同時操作多個io的時候,不能隨時的處理各個io操作。而非阻塞io可以解決...
多路復用select與poll
華清遠見嵌入式學院 講師。在unix linux中有4中io模型,分別為 1 阻塞io 2 非阻塞io 3 io多路復用 4 訊號驅動io 這幾種io模型,阻塞io是最長用到的,並且操作相對簡單,但是缺點在於效率低下,尤其是在,同時操作多個io的時候,不能隨時的處理各個io操作。而非阻塞io可以解決...
IO多路復用 select與poll
1.阻塞與非阻塞 阻塞方式block,程序執行到這一函式時必須等待事件發生,如果沒發生,就一直阻塞函式不能返回 非阻塞 non block 程序或執行緒執行不必等待事件發生一旦執行肯定返回以不停返回返回值來反應函式執 況 select就是這樣監視描述符的變化 2.select模型 兩結構體 stru...