linux c單執行緒I O超時處理

2021-06-09 03:27:22 字數 2648 閱讀 3270

單執行緒i/o超時處理

unix下的i/o超時處理是乙個很常見的問題, 它的通常做法是接收輸入(或傳送輸出)後立刻返回, 如果無輸入(或輸出)則n秒後定時返回.

一般情況下, 處理unix中i/o超時的方式有終端方式, 訊號跳轉方式和多路復用方式等三種. 本節設計乙個定時i/o的例子, 它從檔案描述符0中讀取乙個字元, 當有輸入時繼續, 或者3秒鐘後超時退出,並列印超時資訊.

(1) 終端i/o超時方式

利用ioctl函式, 設定檔案描述符對應的標準輸入檔案屬性為」接收輸入後立刻返回, 如無輸入則3秒後定時返回.

[bill@billstone unix_study]$ cat timeout1.c

#include

#include

#include

int main()

[bill@billstone unix_study]$ make timeout1

cc     timeout1.c   -o timeout1

[bill@billstone unix_study]$ ./timeout1

x120

[bill@billstone unix_study]$ ./timeout1

timeout

(2) 訊號與跳轉i/o超時方式

在read函式前呼叫setjmp儲存堆疊資料並使用alarm設定3秒定時.

[bill@billstone unix_study]$ cat timeout2.c

#include

#include

#include

#include

int timeout = 0;

jmp_buf env;

void timefunc(int sig)

int main()

else

printf("timeout\n");

return 0;

}[bill@billstone unix_study]$ make timeout2

cc     timeout2.c   -o timeout2

[bill@billstone unix_study]$ ./timeout2

v                   // 需要按enter健啟用輸入

118[bill@billstone unix_study]$ ./timeout2

timeout

[bill@billstone unix_study]$

(3) 多路復用i/o超時方式

乙個程序可能同時開啟多個檔案, unix中函式select可以同時監控多個檔案描述符的輸入輸出, 程序將一直阻塞, 直到超時或產生i/o為止, 此時函式返回, 通知程序讀取或傳送資料.

函式select的原型如下:

#include

#include

#include

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

fd_clr(int fd, fd_set *fdset);    // 從fdset中刪去檔案描述符fd

fd_isset(int fd, fd_set *fdset);   // 查詢檔案描述符是否在fdset中

fd_set(int fd, fd_set *fdset);     // 在fdset中插入檔案描述符fd

fd_zero(fd_set *fdset);        // 清空fdset

引數nfds是select監控的檔案描述符的時間, 一般為監控的最大描述符編號加1.

型別fd_set是檔案描述符集合, 其元素為監控的檔案描述符.

引數timeout是描述精確時間的timeval結構,它確定了函式的超時時間,有三種取值情況:

a) null. 函式永遠等待, 直到檔案描述符就緒.

b) 0. 函式不等待, 檢查檔案描述符狀態後立即返回.

c) 其他值. 函式等待檔案描述符就緒, 或者定時完成時返回.

函式select將返回檔案描述符集合中已準備好的檔案總個數. 函式select返回就緒檔案描述符數量後, 必須執行read等函式, 否則函式繼續返回就緒檔案數.

[bill@billstone unix_study]$ cat timeout3.c

#include

#include

#include

#include

int main()

else if(i == 0)

printf("timeout\n");

else

printf("error\n");

return 0;

}[bill@billstone unix_study]$ make timeout3

cc     timeout3.c   -o timeout3

[bill@billstone unix_study]$ ./timeout3

x120

[bill@billstone unix_study]$

[bill@billstone unix_study]$ ./timeout3

timeout

[bill@billstone unix_study]$

多執行緒同步I O和單執行緒非同步I O

2014 08 24 同步i o與非同步i o 執行緒在執行中如果遇到磁碟讀寫或網路通訊 統稱io操作 通常要耗費較長的時間,這時os會剝奪此執行緒的cpu控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式稱為阻塞。當i o操作完畢時,作業系統將這個執行緒的阻塞狀態解除,恢復其...

「多執行緒IO」和「單執行緒非同步IO」的對比

順手寫了個程式對比了一下多執行緒io和單執行緒非同步io的效能差異。需要說明的是,linux上目前的非同步io是由使用者態執行緒模擬的。目前核心原生的aio和glibc中的非同步io都有缺陷,libeio目前感覺比較好 因為nodejs在用 單執行緒非同步io指的是主線程中控制io的 全部都是在主線...

網路程式設計 使用poll單執行緒處理所有I O事件

事件驅動的好處 占用資源少,效率高,可擴充套件性強,是支援高效能高併發的不二之選。事件驅動模型也叫作反應堆模型 reactor 或者是event loop模型,該模型的核心有兩點 任何乙個網路程式,所有的事情可以總結成以下幾種 fork 使用fork建立子程序,為每個到達的客戶連線服務,如下圖,隨著...