在驅動程式設計裡面經常會用到ioctl的系統呼叫,發現cmd = 2的時候,使用者ioctl直接返回-1。
原因在於在linux-x.xx/fs/ioctl.c定義的do_vfs_ioctl函式
1int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int
cmd,
2 unsigned long
arg)325
return
error;
26 }
發現do_vfs_ioctl實現先判斷系統的cmd不匹配後才判斷使用者的cmd。
從以下**可以得出 figetbsz = 2。
1#define figetbsz _io(0x00,2) /* get the block size used for bmap */23
4 * used to create numbers * /
5#define _io(type,nr) _ioc(_ioc_none,(type),(nr),0)
6#define _ior(type,nr,size) _ioc(_ioc_read,(type),(nr),(_ioc_typecheck(size)))
7#define _iow(type,nr,size) _ioc(_ioc_write,(type),(nr),(_ioc_typecheck(size)))
8#define _iowr(type,nr,size) _ioc(_ioc_read|_ioc_write,(type),(nr),(_ioc_typecheck(size)))
9#define _ior_bad(type,nr,size) _ioc(_ioc_read,(type),(nr),sizeof(size))
10#define _iow_bad(type,nr,size) _ioc(_ioc_write,(type),(nr),sizeof(size))
11#define _iowr_bad(type,nr,size) _ioc(_ioc_read|_ioc_write,(type),(nr),sizeof(size))
1213
14#define _ioc(dir,type,nr,size) \
15 (((dir) << _ioc_dirshift) |\
16 ((type) << _ioc_typeshift) |\
17 ((nr) << _ioc_nrshift) |\
18 ((size) <<_ioc_sizeshift))
1920
21#define _ioc_nrshift 0
22#define _ioc_typeshift (_ioc_nrshift+_ioc_nrbits)
23#define _ioc_sizeshift (_ioc_typeshift+_ioc_typebits)
24#define _ioc_dirshift (_ioc_sizeshift+_ioc_sizebits)
2526
#define _ioc_nrbits 8
27#define _ioc_typebits 8
2829
30#ifndef _ioc_sizebits
31#define _ioc_sizebits 14
32#endif
3334
#ifndef _ioc_dirbits
35#define _ioc_dirbits 2
36#endif
其實核心cmd有乙個格式,使使用者cmd不與系統cmd衝突,解決辦法就是用_io、_iow、_ior和_iowr產生cmd。
cmd的格式為:
dir:size:type:num = 2:14:8:8
其中type可以自定義乙個ascii碼,假設是一條輸入命令,num = 1,size為char。則可以利用_iow('a', 1, char)自動生成cmd
LInux下的網路ioctl使用
最近需要修改linux下的網路引數,遂將linux下用於控制網路引數的 ioctl常用函式記錄一下,使用的時候注意使包裹對應的標頭檔案,其中sockios.件包含所有的操作命令字,int main int argc,char ar int error struct ethtool link sett...
linux下遠端訪問redis遇到的坑
翻牆?哪門子翻牆?你懂技術嗎?redis的安裝參考 但是上述文章有乙個問題,就是沒用關閉protected mode 保護模式 並且繫結了ip。bind ip 視情況而定。本人注釋掉 bind ip 關閉了保護模式 protected mode no 外網就可以正常訪問了。當然,記得開放埠的防火牆。...
Linux下ioctl函式理解
一 什麼是ioctl ioctl是裝置驅動程式中對裝置的i o通道進行管理的函式。所謂對i o通道進行管理,就是對裝置的一些特性進行控制,例如串列埠的傳輸波特率 馬達的轉速等等。它的呼叫個數如下 int ioctl int fd,ind cmd,其中fd就是使用者程式開啟裝置時使用open函式返回的...