linux驅動學習之非同步通知

2021-06-22 08:56:24 字數 1836 閱讀 8908

非同步通知是裝置狀態改變後主動通知應用程式,這樣應用程式就不需要阻塞或查詢裝置了。應用通過訊號來處理核心的非同步通知,上次使用poll select來查詢裝置的可讀狀態,下面這個例子類似,不同的是當裝置有資料時主動通知應用去讀資料。

應用的c**很簡單,主要設定對訊號的處理方式,核心有資料時會收到sigio訊號,應用會自動呼叫signal設定的函式去讀資料。

main.c

#include #include #include #include unsigned char rdbuf[1024];  

int fd;

void hand_signal(int sign)

}int main (int *argc,char**argv)

/*告訴驅動訊號傳送給誰 第三個引數傳的是程序號*/

fcntl(fd, f_setown, getpid());

/*設定fasync 執行後驅動的fasync方法被呼叫*/

flags = fcntl(fd, f_getfl);

fcntl(fd, f_setfl, flags | fasync);

while(1);

}

驅動主要**,讀操作只返回最後一次寫入的字串,寫操作後向設定的程序傳送sigio訊號

struct file_operations ops=

;int fileops_release(struct inode *inode,struct file *filp)

ssize_t fileops_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

ssize_t fileops_write(struct file *filp, const char __user *buff, size_t count, loff_t *offp)

int fileops_fasync (int fd, struct file *filp, int mode)

測試結果

先編譯載入驅動

[root@localhost ctest]# insmod moddev.ko

執行應用

[root@localhost ctest]# ./main 開啟另一終端向裝置寫入資料

[root@localhost ctest]# echo 111 > /dev/moduledev60

應用輸出,每次資料寫入資料後,驅動通知應用讀取裝置

[root@localhost ctest]# ./main

read data:111

附fasync_helper原始碼

/* * fasync_helper() is used by some character device drivers (mainly mice)

* to set up the fasync queue. it returns negative on error, 0 if it did

* no changes and positive if it added/deleted the entry.

*/ write_lock_irq(&fasync_lock);

if (fa->fa_file == filp) else

goto out;

} }if (on)

out:

write_unlock_irq(&fasync_lock);

return result;

}

linux中驅動非同步通知

驅動程式執行在核心空間中,應用程式執行在使用者空間中,兩者是不能直接通訊的。但在實際應用中,在裝置已經準備好的時候,我們希望通知使用者程式裝置已經ok,使用者程式可以讀取了,這樣應用程式就不需要一直查詢該裝置的狀態,從而節約了資源,這就是非同步通知。好,那下乙個問題就來了,這個過程如何實現呢?簡單,...

Linux驅動基本理論之 非同步通知

linux驅動基本理論之 非同步通知 在linux核心中的io模型基本分為4類 1 同步阻塞i o 2 同步非阻塞i o 3 非同步阻塞i o 4 非同步非阻塞i o 同步 應用顯式地通過函式訪問資料,在此函式返回時就會得到結果 成功或失敗 非同步 應用會顯示地通過函式提出訪問或關注申請。資料到達時...

Linux驅動中的非同步通知

在很多應用中都需要應用程式主動去查詢驅動中是否有資料可讀或者是否可以向驅動寫入資料,對於單執行緒的應用,這可能會導致程序阻塞。當然,可以使用select來不斷輪詢驅動是否可讀或可寫,但是這並不是很好的解決方法,更好的解決方式是由驅動主動通知應用程式其狀態,而不是應用程式主動去查詢驅動的狀態。非同步通...