2009年12月16日 星期三

ioctl 函數

ioctls are typically employed to allow userspace code to communicate with hardware devices or kernel components.

ioctl是應用程式用來和驅動程式溝通的function
讓應用程式可以對某個裝置下命令
在unix/linux環境中, 裝置的存取和檔案是一樣的
一般會先用open()來取得對裝置的一個控制權
其中,open會傳回一個handle值

ioctl(handle, command, …)

前面handle跟command是必須的,後面的參數則視情況而定

其中handle就是open函式傳回來的值
command就是一個command code
command code每個值所代表的命令會因裝置而不同
完全由驅動程式來解釋command code的意義
若是有的command code還需要傳進其他參數時
就會使用第3、第4個參數了

因此使用ioctl之前,
要先看是要對那個裝置下命令
再去查那個裝置的驅動程式
支援哪些command code讓應用程式使用

而當應用程式呼叫 ioctl時
相對應的驅動程式會有一個callback function被呼叫到
這個callback function專門用來處理 ioctl傳入的command code
你呼叫ioctl時可以傳哪些command code
以及要傳哪些參數都和此callback function有關


例如
int nread;
ioctl( 0, FIONREAD, &nread);
/* 0 是表示標準輸入 standard in */
/* FIONREAD 就是 standard in 的 command code */
此函數呼叫能夠得到緩衝區裡面有多少bytes要被讀取
值就放在nread變數中
接下來就可以呼叫
nread = read( 0, buffer, nread );
來讀取緩衝區內的值


[Reference]
http://planet.nccucs.org/2008/10/19/775/
http://bbs.chinaunix.net/viewthread.php?tid=1302131

沒有留言:

張貼留言