- int ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg);
ioctl中第一個參數和第二個參數很明白。
要很好的編寫驅動ioctl,就需要理解第三個參數cmd。
size: 14bit,數據大小,通常和第四個參數有關
type: 8bit,類型,又稱之爲幻數,表示設備的類型
nr: 8bit,命令序號。
ioctl (int __fd, unsigned long int __request, ...)
int __request 是請求命令字,這是與設備相關的,也就是對應驅動程序ioctl中的cmd
第三個參數依賴於第二個參數,通常是一個指針,或有或無。
- int main(void)
- {
- int fd = open("/dev/scull",O_RDONLY);
- int qset_size = 2000;
- if(fd<0){
- printf("error/n");
- return 0;
- }
- ioctl(fd, _IO('k',0) ); // 其中k是scull設備的類型
- // 這條命令是復位scull設備中量子和量子集的大小。
- printf("%d/n", ioctl(fd,_IO('k',8) ) ); // 獲取默認量子集大小
- ioctl(fd, _IOW('k',2,int), &qset_size ); // 更改量子集大小
- printf("%d/n", ioctl(fd,_IO('k',8) ) );
- close(fd);
- return 0;
- }
而在應用程序中通常是直接給出其值。比如ioctl(sock, SIOCGIFNAME, &ifr)來獲取接口名.