linux下ioctl遇到的坑

2022-03-23 12:22:18 字數 2069 閱讀 4476

在驅動程式設計裡面經常會用到ioctl的系統呼叫,發現cmd = 2的時候,使用者ioctl直接返回-1。

原因在於在linux-x.xx/fs/ioctl.c定義的do_vfs_ioctl函式

1

int 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函式返回的...