「曾經有乙份真摯的愛情擺在面前,我卻不懂珍惜;曾經有乙個承諾,我卻倍感珍惜,今天一定要好好講講..」
講講啥,講講上節說的那個非同步通知的例子唄,大家喜歡看**,咋們就先上**:
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...