Linux核心開發之非同步通知與非同步I O 二

2021-06-22 08:26:45 字數 1606 閱讀 2808

「曾經有乙份真摯的愛情擺在面前,我卻不懂珍惜;曾經有乙個承諾,我卻倍感珍惜,今天一定要好好講講..」

講講啥,講講上節說的那個非同步通知的例子唄,大家喜歡看**,咋們就先上**:

struct globalfifo_dev                                     

;/*檔案釋放函式*/

int globalfifo_release(struct inode *inode, struct file *filp)

static

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

/*globalfifo寫操作*/

static ssize_t globalfifo_write(struct file *filp, const

char __user *buf,

size_t count, loff_t *ppos)

__set_current_state(task_interruptible); //改變程序狀態為睡眠

up(&dev->sem);

schedule(); //排程其他程序執行

if (signal_pending(current))

//如果是因為訊號喚醒

down(&dev->sem); //獲得訊號量

} /*從使用者空間拷貝到核心空間*/

if (count > globalfifo_size - dev->current_len)

count = globalfifo_size - dev->current_len;

if (copy_from_user(dev->mem + dev->current_len, buf, count))

else

out: up(&dev->sem); //釋放訊號量

out2:remove_wait_queue(&dev->w_wait, &wait); //從附屬的等待佇列頭移除

set_current_state(task_running);

return ret;

}下面再給出測試程式:

#include ...

//接收到非同步讀訊號的動作

void input_handler(int signum)

int main()

} else

}

當我們載入完驅動並建立完裝置節點後,執行上述程式,每當通過echo向/dev/globalfilfo寫入新的資料後,input_handler將會被呼叫。如下所示:

echo 0>/dev/globalfifo

receive a signal from globalfifo ,signalnum:29

echo 0>/dev/globalfifo

receive a signal from globalfifo ,signalnum:29

echo 0>/dev/globalfifo

receive a signal from globalfifo ,signalnum:29

通過上邊實際的例子,小王,明白了吧,我的承諾也兌現了,下次咱們可要開始更高階的東西了..

Linux核心開發之非同步通知與非同步I O 一

小王,聽說過錦上添花吧.我拍拍下王的頭說。還錦上添花你,為你上次提的幾個東東,我是頭上長包.小王氣憤地瞪著我。啊,為啥這樣呢,本來還特意拒絕了mm的約會,抽出時間打算給你說點高階的東東,看來現在是不行了 我吃驚道,這樣吧,這次就給你講些和前邊有關的東西,也不失為錦上添花不是?好,我也是這麼打算的,就...

Linux核心開發之非同步通知與非同步I O 五

小王呢,今天開始講aio與裝置驅動,這也是裝置驅動通知與非同步io的最後一節了,下次咱們就要開始講更高階的東西,比如中斷啦,時鐘等 在linux核心中,每個io請求都對應乙個kiocb結構體,其ki filp成員指向對應的file指標,通過is sync kiocb可以判斷某kiocb時候為同步io...

Linux核心開發之非同步通知與非同步I O 一

非同步通知 很簡單,一旦裝置準備好,就主動通知應用程式,這種情況下應用程式就不需要查詢裝置狀態,這是不是特像硬體上常提的 中斷的概念 上邊比較 準確的說法其實應該叫做 訊號驅動的非同步i o 訊號是在軟體層次上對中斷機制的一種模擬。阻塞i o意味著一直等待裝置可訪問時再訪問,非阻塞i o意味著使用p...