linux的非同步IO 使用signal實現中斷

2021-09-11 14:04:57 字數 1569 閱讀 8942

#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...