前面有提到io的多路復用,解決了阻塞式訪問的困境。這裡再介紹一種解決方法——非同步io
1、非同步io的實現原理很想硬體上的中斷。非同步io就是作業系統用軟體實現的一套中斷響應系統,工作方法是當前程序註冊乙個非同步io事件(使用signal註冊乙個訊號sigio的處理函式),然後當前程序可以正常處理自己的事情,當非同步事件發生後當前程序會收到乙個sigio訊號從而執行繫結的處理函式去處理這個非同步事件。
涉及的函式:
所需標頭檔案
#include
#include
函式原型
int fcntl(int fd, int cmd, ... /* arg */ );
函式傳入值
fd:檔案描述符
cmd:命令
複製乙個現有的檔案描述符:f_dupfd
獲取或設定檔案描述符標記:f_getfd、f_setfd
獲取或設定檔案狀態標記:f_getfl、f_setfl
獲取或設定鎖:f_setlk、f_setlkw、f_getlk
獲取或設定非同步io所有權:f_getown、f_setown、f_getsig、f_setsig
lease、file and directory change notification等等,具體檢視man手冊
...:可變引數
函式返回值
成功:>=0,根據cmd的取值返回不同的含義值
失敗:返回-1
實現非同步io使用到的cmd是f_getfl、f_setfl、f_setown、o_async
所需標頭檔案
#include
函式原型
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
函式傳入值
signum:指明了所要處理的訊號型別,它可以取除了sigkill和sigstop外的任何一種訊號
handler:描述了與訊號關聯的動作,它可以取三種值:
sig_ign:這個符號表示忽略該訊號
sig_dfl:這個符號表示恢復對訊號的系統預設處理。不寫此處理函式預設也是執行系統預設操作
func(返回值型別為sighandler_t的函式名):接收到訊號後,執行指定的處理方式
函式返回值
成功:返回先前的訊號處理函式指標
失敗:返回sig_err(-1)
func函式必須在signal()被呼叫前申明,handler中為這個函式的名字。當接收到乙個型別為sig的訊號時,就執行handler 所指定的函式。(int)signum是傳遞給它的唯一引數。執行了signal()呼叫後,程序只要接收到型別為sig的訊號,不管其正在執行程式的哪一部分,就立即執行func()函式。當func()函式執行結束後,控制權返回程序被中斷的那一點繼續執行。
signal()會依引數signum 指定的訊號編號來設定該訊號的處理函式。當指定的訊號到達時就會跳轉到引數handler指定的函式執行。當乙個訊號的訊號處理函式執行時,如果程序又接收到了該訊號,該訊號會自動被儲存而不會中斷訊號處理函式的執行,直到訊號處理函式執行完畢再重新呼叫相應的處理函式。但是如果在訊號處理函式執行時程序收到了其它型別的訊號,該函式的執行就會被中斷。
2、這裡依然用滑鼠鍵盤的例子進行說明
#include #include #include #include #include #include #include int mousefd = -1;
// 繫結到sigio訊號,在函式內處理非同步通知事件
void func(int sig);
if (sig != sigio)
return;
read(mousefd, buf, 50);
printf("滑鼠讀出的內容是:[%s].\n", buf);
}int main(void)
// 把滑鼠的檔案描述符設定為可以接受非同步io
flag = fcntl(mousefd, f_getfl);
flag |= o_async;
fcntl(mousefd, f_setfl, flag);
// 把非同步io事件的接收程序設定為當前程序
fcntl(mousefd, f_setown, getpid());
// 註冊當前程序的sigio訊號捕獲函式
signal(sigio, func);
// 讀鍵盤
while (1)
return 0;
}
Linux串列埠應用程式設計
常見的資料通訊的基本方式可分為並行通訊與序列通訊兩種。1.並行通訊是指利用多條資料傳輸線將乙個字資料的各位元位同時傳送。它的特點是傳輸速度快,適用於傳輸距離短且傳輸速度較高的通訊。2.序列通訊是指利用一條傳輸線將資料以位元位為單位順序傳送。特點是通訊 線路簡單,利用簡單的線纜就可實現通訊,降低成本,...
Linux應用程式設計 mmap
二話不說,上來就問下那個man name mmap,munmap map or unmap files or devices into memory synopsis include void mmap void addr,size t length,int prot,int flags,int f...
IAP 應用程式設計
1 檢查是否需要對第二部分 進行更新 2 如果不需要更新則轉到4 3 執行更新操作 4 跳轉到第二部分 執行 第一部分 必須通過其它手段,如jtag或isp燒入 第二部分 可以使用第一部分 iap功能燒入,也可以和第一部分 一道燒入,以後需要程式更新是再通過第一部分iap 更新。對於stm32來說,...