#include #include #include #include #include #include #include char buff[20];
int mousefd=-1;
int ret=-1;
int flag=0;
/* 在函式內處理非同步通知事件*/
void func(int sig)
else
.\n",sig);
memset(buff,0,sizeof(buff));
ret=read(mousefd,buff,10);
if(ret>0)
.\n",buff);
} else
}}int main(void)
// 將滑鼠的檔案描述符設定為可以接受非同步io
flag=fcntl(mousefd,f_getfl); //獲得mousefd檔案描述符的標誌位
flag |=o_async; //設定flag,當i/o可用的時候,允許sigio訊號傳送到程序組
fcntl(mousefd,f_setfl,flag); //設定滑鼠的檔案描述符mousefd為flag特性的
//將非同步io事件的接收程序設定為當前程序
fcntl(mousefd,f_setown,getpid());
//註冊當前程序的sigio訊號捕捉函式
signal(sigio,func);
while(1)
.\n",buff); }
}
1. signal函式原型說明此函式需要兩個引數,
返回乙個函式指標,而這個指標指向的函式無返回值(void)。
第乙個引數signo是乙個整數,
第二個引數是函式指標,它所指向的函式需要乙個整型引數,無返回值。
signal的返回值是乙個函式位址,該函式有乙個整型引數(即最後的(int))。
用自然語言來描述也就是要向訊號處理程式(func) 傳送乙個整型引數,無返回值。
當呼叫signal設定訊號處理程式時,第二個引數是指向該函式(也就是訊號 處理程式)的指標。signal的返回值則是指向之前的訊號處理程式的指標。
關於signal函式最後的(int),其實簡單的說就是因為signal返回了乙個函式指標,這個函式指標有乙個(int)型引數(即void (*func)(int)中的int),這兩個值應該是保持一致的。
如果signal函式不是返回的函式指標,那麼我們的抽象函式可以定義為如下形式:int ( *test)(....)這樣的形式。
或者如果指向的函式沒有引數(即void),我們也可以寫為: int *(* test)(void),這樣的形式。
注:鍵盤為標準的輸入,其對應的檔案描述符為0;
滑鼠對應的檔案在/dev/input內,可利用 cat mouse* 的方式,進行滑鼠對應檔案的的測試
如:輸入cat mouse0 然後晃動滑鼠,會有資訊列印,cat mouse1或者mouse2後不會有資訊的列印
flink 非同步io使用
當與外部系統互動時 例如,當使用儲存在資料庫中的資料來豐富流事件時 需要注意與外部系統的通訊延遲不會影響流應用程式的整體工作。直接訪問外部資料庫中的資料,例如在mapfunction中,通常意味著同步互動 向資料庫傳送請求,並且mapfunction等待直到收到響應。在許多情況下,這種等待佔據了函式...
Linux 核心101 非同步IO
posix 非同步 io inte ce aio 定義了允許程序建立乙個或多個非同步的 io 操作的介面。程序可以在 io 操作完成之後得到作業系統的通知,手段包括 不通知 訊號 例項化thread。注意 這只是 posix the portable operating system inte ce...
linux下非同步IO的簡單例子
首先,貼一下非同步io中用的的一些結構體,因為平常很少用,整理起來方便檢視。aio.h中的struct aiocb struct aiocb siginfo.h中的struct sigevent和union sigval typedef struct sigevent sigev thread si...