在linux驱动中经常用到的函数为open、read、write用于对设备进行读取和写入数据,但是除了上述功能之外还有另外一个重要的功能ioctl,很多时候用户程序需要根据自己的需求配置所操纵的硬件,比如修改波特兰,获取设备信息等,可以通过ioctl方法来进行与该设备的驱动进行交互,ioctl是在用户层可以之间与内核驱动打交道最直接的方式,但是其自身也有一些缺点。

ioctl整个可以分为用户和内核两个部分。

系统调用ioctl

用户层主要是通过使用ioctl系统调用函数来直接控制设备相关配置,可以使用man 查看其函数原型:

int ioctl(int fd, unsigned long request,...)

对该函数解释如下:

The ioctl() system call manipulates the underlying device parameters of special files. In particular, many operating char acteristics of character special files(e.g., terminals) may be controlled with ioctl() requests.

函数参数:

int fd:打开的文件描述符...

unsigned long request: 在旧的版本中称之为ioctl command,之后进行了修改称置为 a device-dependent request code,主要为ioctl的命令字段,拥有固定的格式,包含系统预定义命令以及每个驱动设备特有的自定义命令字段

 ...:表示为一个可选参数,并不是数目不一定的一串参数,习惯上使用char *argp来定义,而在这里只是为了在编译时防止编译器进行类型检查。其参数的具体形式依赖于要完成的控制命令,也就是第二个参数某些控制命令不需要参数,某些需要一个整数参数,而一些则需要一个指针参数。使用指针可以向ioctl调用传递任意数据,这样设备可以与用户空间交换任意的数据。

内核unlocked_ioctl

在前面《linux 内核inode VS file》提到struct file 是一种进程资源,在每个进程中每打开一个文件将会创建一个file结构,通过文件描述符将file结构在进行资源task中进行管理所有当前进程打开的文件,而针对驱动文件而言,当使用ioctl操作该设备时,实际上是调用的struct file_operations结构中的unlocked_ioctl,每个驱动设备严格意义上需要实现自己特有的ioctl命令相对应的实现,该回调函数定义如下:

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long)

实际上系统调用ioctl最终就是调用的struct file_operations中的unlocked_ioctl回调函数。

ioctl command命令字段

在编写ioctl代码之前,需要选择对应不同命令的编号。多数程序源的第一本能是从0或者1开始选择一组小的编号。然而,有许多理由要求不能这样选择命令编号。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非串行设备输入流改波特率。如果每一个ioctl 命令都是唯一的,应用程序进行这种操作时就会得到一个EINVAL错误,而不是无意间成功地完成了意想不到的caoz。

kernel经过多个版本的演进,ioctl command为一个32位无符号整型,将其划分位4个字段,其划分方式如下:

  •  nr: number序列号,用于表示该命令字段内的序列号
  • type: 类型也有称幻数,同一个ioctl内的所有命令字段的type 都相同。
  • size: 所涉及到用户数据大小,即系统调用ioctl传递的数据大小
  • direction: 数据的传递方向。

nr(number)

为一个8bit大小的位宽,一般是由驱动开发人员自己定义

type

8bit 大小,该数据为全局唯一

size

用户数据的大小,这个字段的宽度与体系结构有关,通常是13位或者14位。内核并不会检查这个位字段,对该字段的正确使用可以帮助我们检测用户空间的错误,并且如果我们从不改变相关数据项大小,这个字段还可以帮助我们实现向后兼容

direction

数据传输方向,为了操作方便,内核在include\uapi\asm-generic\ioctl.h定义了几个特殊的宏:

#ifndef _IOC_NONE
# define _IOC_NONE  0U
#endif#ifndef _IOC_WRITE
# define _IOC_WRITE 1U
#endif#ifndef _IOC_READ
# define _IOC_READ  2U
#endif

数据传输是从应用程序的角度说明,比如_IOC_READ意味着是从设备中读取数据,所以驱动程序必须向用户空间写入数据。如果该命令即可读也可写则可以使用逻辑AND操作:_IOC_READ|_IOC_WRITE

ioctl command常见宏

内核在include\uapi\asm-generic\ioctl.h文件中定义了几个基本常见宏:

#define _IOC_NRBITS  8
#define _IOC_TYPEBITS   8#ifndef _IOC_SIZEBITS
# define _IOC_SIZEBITS  14
#endif#ifndef _IOC_DIRBITS
# define _IOC_DIRBITS   2
#endif#define _IOC_NRMASK   ((1 << _IOC_NRBITS)-1)
#define _IOC_TYPEMASK   ((1 << _IOC_TYPEBITS)-1)
#define _IOC_SIZEMASK   ((1 << _IOC_SIZEBITS)-1)
#define _IOC_DIRMASK    ((1 << _IOC_DIRBITS)-1)#define _IOC_NRSHIFT   0
#define _IOC_TYPESHIFT  (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT  (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DIRSHIFT   (_IOC_SIZESHIFT+_IOC_SIZEBITS)

其中根据上述的几个宏定义了一个基本的ioctl命令宏_IOC

#define _IOC(dir,type,nr,size) \(((dir)  << _IOC_DIRSHIFT) | \((type) << _IOC_TYPESHIFT) | \((nr)   << _IOC_NRSHIFT) | \((size) << _IOC_SIZESHIFT))

dir为数据方向,type为命令类型,nr为命令序列号, size为数据大小,为了进一步操作方便,内核又在_IOC宏上定义了几个宏:

#define _IO(type,nr)     _IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size)  _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOW(type,nr,size)  _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOR_BAD(type,nr,size)  _IOC(_IOC_READ,(type),(nr),sizeof(size))
#define _IOW_BAD(type,nr,size)  _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
#define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))

_IO为既不是读也不是写命令类型

_IOR为 read 命令类型

_IOW为write命令类型

上述几个宏内部又添加了size大小检查

_IOXX_BAD类型宏没有size大小检查。

ioctl command分配情况

在内核\Documentation\userspace-api\ioctl\ioctl-number.rst文件中列出了其使用情况,以下是在linux-5.10.11版本中ioctl commnand已分配情况:

Code(Type) Seq#(hex) Include File
0x00 00-1F linux/fs.h conflict!
0x00 00-1F scsi/scsi_ioctl.h conflict!
0x00 00-1F linux/fb.h conflict!
0x00 00-1F linux/wavefront.h conflict!
0x02 all linux/fd.h  
0x03 all linux/hdreg.h  
0x04 D2-DC linux/umsdos_fs.h Dead
0x06 all linux/lp.h  
0x09 all linux/raid/md_u.h  
0x10 00-0F drivers/char/s390/vmcp.h  
0x10 10-1F arch/s390/include/uapi/sclp_ctl.h  
0x10 20-2F arch/s390/include/uapi/asm/hypfs.h  
0x12 all linux/fs.h
linux/blkpg.h
 
0x1b all InfiniBand Subsystem  <http://infiniband.sourceforge.net/>
0x20 all drivers/cdrom/cm206.h  
0x22 all scsi/sg.h  
'!' 00-1F uapi/linux/seccomp.h  
'#' 00-3F   IEEE 1394 Subsystem      Block for the entire subsystem
'$' 00-0F linux/perf_counter.h, linux/perf_event.h
'%' 00-0F include/uapi/linux/stm.h System <mailto:alexander.shishkin@linux.intel.com>
'&' 00-07 drivers/firewire/nosy-user.h  
'1' 00-1F linux/timepps.h PPS <ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/>
'2' 01-04 linux/i2o.h  
'3' 00-0F drivers/s390/char/raw3270.h conflict!
'3' 00-1F linux/suspend_ioctls.h,
kernel/power/user.c
conflict!
'8' all SNP8023 advanced <mailto:mcr@solidum.com>
';' 64-7F linux/vfio.h  
'@' 00-0F linux/radeonfb.h conflict!
'@' 00-0F drivers/video/aty/aty128fb.c conflict!
'A' 00-1F linux/apm_bios.h conflict!
'A' 00-0F linux/agpgart.h,
drivers/char/agp/compat_ioctl.h
conflict!
'A' 00-7F sound/asound.h conflict!
'B' 00-1F linux/cciss_ioctl.h conflict!
'B' 00-0F include/linux/pmu.h conflict!
'B' C0-FF advanced bbus
'C' all linux/soundcard.h conflict!
'C' 01-2F linux/capi.h conflict!
'C' F0-FF drivers/net/wan/cosa.h conflict!
'D' all arch/s390/include/asm/dasd.h  
'D' 40-5F drivers/scsi/dpt/dtpi_ioctl.h  
'D' 05 drivers/scsi/pmcraid.h  
'E' all linux/input.h conflict!
'E' 00-0F xen/evtchn.h conflict!
'F' all linux/fb.h conflict!
'F' 01-02 drivers/scsi/pmcraid.h conflict!
'F' 20 drivers/video/fsl-diu-fb.h conflict!
'F' 20 drivers/video/intelfb/intelfb.h conflict!
'F' 20 linux/ivtvfb.h conflict!
'F' 20 linux/matroxfb.h conflict!
'F' 20 drivers/video/aty/atyfb_base.c conflict!
'F' 00-0F video/da8xx-fb.h conflict!
'F' 80-8F linux/arcfb.h conflict!
'F' DD video/sstfb.h conflict!
'G' 00-3F drivers/misc/sgi-gru/grulib.h conflict!
'H' 00-7F linux/hiddev.h conflict!
'H' 00-0F linux/hidraw.h conflict!
'H' 01 linux/mei.h conflict!
'H' 02 linux/mei.h conflict!
'H' 03 linux/mei.h conflict!
'H' 00-0F sound/asound.h conflict!
'H' 20-40 sound/asound_fm.h conflict!
'H' 80-8F sound/sfnt_info.h conflict!
'H' 10-8F sound/emu10k1.h conflict!
'H' 10-1F sound/sb16_csp.h conflict!
'H' 10-1F sound/hda_hwdep.h conflict!
'H' 40-4F sound/hdspm.h conflict!
'H' 40-4F sound/hdsp.h conflict!
'H' 90 sound/usb/usx2y/usb_stream.h  
'H' 00-0F uapi/misc/habanalabs.h conflict!
'H' A0 uapi/linux/usb/cdc-wdm.h  
'H' C0-F0 net/bluetooth/hci.h conflict!
'H' C0-DF net/bluetooth/hidp/hidp.h conflict!
'H' C0-DF net/bluetooth/cmtp/cmtp.h conflict!
'H' C0-DF net/bluetooth/bnep/bnep.h conflict!
'H' F1 linux/hid-roccat.h <mailto:erazor_de@users.sourceforge.net>
'H' F8-FA sound/firewire.h  
'I' all linux/isdn.h conflict!
'I' 00-0F drivers/isdn/divert/isdn_divert.h conflict!
'I' 40-4F linux/mISDNif.h conflict!
'J' 00-1F drivers/scsi/gdth_ioctl.h  
'K' all linux/kd.h  
'L' 00-1F linux/loop.h conflict!
'L' 10-1F drivers/scsi/mpt3sas/mpt3sas_ctl.h conflict!
'L' 20-2F linux/lightnvm.h  
'L' E0-FF linux/ppdd.h encrypted <http://linux01.gwdg.de/~alatham/ppdd.html>
'M' all linux/soundcard.h conflict!
'M' 01-16 mtd/mtd-abi.h conflict!
  and drivers/mtd/mtdchar.c  
'M' 01-03 drivers/scsi/megaraid/megaraid_sas.h  
'M' 00-0F drivers/video/fsl-diu-fb.h conflict!
'N' 00-1F drivers/usb/scanner.h  
'N' 40-7F drivers/block/nvme.c  
'O' 00-06 mtd/ubi-user.h UBI
'P' all linux/soundcard.h conflict!
'P' 60-6F sound/sscape_ioctl.h conflict!
'P' 00-0F drivers/usb/class/usblp.c conflict!
'P' 01-09 drivers/misc/pci_endpoint_test.c conflict!
'Q' all linux/soundcard.h  
'R' 00-1F linux/random.h conflict!
'R' 01 linux/rfkill.h conflict!
'R' C0-DF net/bluetooth/rfcomm.h  
'S' all linux/cdrom.h conflict!
'S' 80-81 scsi/scsi_ioctl.h conflict!
'S' 82-FF scsi/scsi.h conflict!
'S' 00-7F sound/asequencer.h conflict!
'T' all linux/soundcard.h conflict!
'T' 00-AF sound/asound.h conflict!
'T' all arch/x86/include/asm/ioctls.h conflict!
'T' C0-DF linux/if_tun.h conflict!
'U' all sound/asound.h conflict!
'U' 00-CF linux/uinput.h conflict!
'U' 00-EF linux/usbdevice_fs.h  
'U' C0-CF drivers/bluetooth/hci_uart.h  
'V' all linux/vt.h conflict!
'V' all linux/videodev2.h conflict!
'V' C0 linux/ivtvfb.h conflict!
'V' C0 linux/ivtv.h conflict!
'V' C0 media/davinci/vpfe_capture.h conflict!
'V' C0 media/si4713.h conflict!
'W' 00-1F linux/watchdog.h conflict!
'W' 00-1F linux/wanrouter.h conflict!
'W' 00-3F sound/asound.h conflict!
'W' 40-5F drivers/pci/switch/switchtec.c  
'W' 60-61 linux/watch_queue.h  
'X' all fs/xfs/xfs_fs.h,
fs/xfs/linux-2.6/xfs_ioctl32.h,
include/linux/falloc.h,
linux/fs.h,
conflict!
'X' all fs/ocfs2/ocfs_fs.h conflict!
'X' 01 linux/pktcdvd.h conflict!
'Y' all linux/cyclades.h  
'Z' 14-15 drivers/message/fusion/mptctl.h  
'[' 00-3F linux/usb/tmc.h USB <mailto:gregkh@linuxfoundation.org>
'a' all linux/atm*.h,
linux/sonet.h
 <http://lrcwww.epfl.ch/>
'a' 00-0F drivers/crypto/qat/qat_common/adf_cfg_common.h conflict!
'b' 00-FF   conflict! bit3 <mailto:natalia@nikhefk.nikhef.nl>
'c' all linux/cm4000_cs.h conflict!
'c' 00-7F linux/comstats.h conflict!
'c' 00-7F linux/coda.h conflict!
'c' 00-1F linux/chio.h conflict!
'c' 80-9F arch/s390/include/asm/chsc.h conflict!
'c' A0-AF arch/x86/include/asm/msr.h conflict!
'd' 00-FF linux/char/drm/drm.h conflict!
'd' 02-40 pcmcia/ds.h conflict!
'd' F0-FF linux/digi1.h  
'e' all linux/digi1.h conflict!
'f' 00-1F linux/ext2_fs.h conflict!
'f' 00-1F linux/ext3_fs.h conflict!
'f' 00-0F fs/jfs/jfs_dinode.h conflict!
'f' 00-0F fs/ext4/ext4.h conflict!
'f' 00-0F linux/fs.h conflict!
'f' 00-0F fs/ocfs2/ocfs2_fs.h conflict!
'f' 13-27 linux/fscrypt.h  
'f' 81-8F linux/fsverity.h  
'g' 00-0F linux/usb/gadgetfs.h  
'g' 20-2F linux/usb/g_printer.h  
'h' 00-7F   conflict! Charon <mailto:zapman@interlan.net>
'h' 00-1F linux/hpet.h conflict!
'h' 80-8F fs/hfsplus/ioctl.c  
'i' 00-3F linux/i2o-dev.h conflict!
'i' 0B-1F linux/ipmi.h conflict!
'i' 80-8F linux/i8k.h  
'j' 00-3F linux/joystick.h  
'k' 00-0F linux/spi/spidev.h conflict!
'k' 00-05 video/kyro.h conflict!
'k' 10-17 linux/hsi/hsi_char.h HSI
'l' 00-3F linux/tcfs_fs.h transparent http://web.archive.org/web/%2A/http://mikonos.dia.unisa.it/tcfs
'l' 40-7F linux/udf_fs_i.h in http://sourceforge.net/projects/linux-udf/
'm' 00-09 linux/mmtimer.h conflict!
'm' all linux/mtio.h conflict!
'm' all linux/soundcard.h conflict!
'm' all linux/synclink.h conflict!
'm' 00-19 drivers/message/fusion/mptctl.h conflict!
'm' 00 drivers/scsi/megaraid/megaraid_ioctl.h conflict!
'n' 00-7F linux/ncp_fs.h and
'n' 80-8F uapi/linux/nilfs2_api.h NILFS2
'n' E0-FF linux/matroxfb.h matroxfb
'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2
'o' 00-03 mtd/ubi-user.h conflict!
'o' 40-41 mtd/ubi-user.h UBI
'o' 01-A1 `linux/dvb/*.h` DVB
'p' 00-0F linux/phantom.h conflict!
'p' 00-1F linux/rtc.h conflict!
'p' 40-7F linux/nvram.h  
'p' 80-9F linux/ppdev.h user-space <mailto:tim@cyberelk.net>
'p' A1-A5 linux/pps.h LinuxPPS <mailto:giometti@linux.it>
'q' 00-1F linux/serio.h  
'q' 80-FF linux/telephony.h
linux/ixjuser.h
Internet PhoneJACK, Internet LineJACK
http://web.archive.org/web/%2A/http://www.quicknet.net
'r' 00-1F linux/msdos_fs.h and
's' all linux/cdk.h  
't' 00-7F linux/ppp-ioctl.h  
't' 80-8F linux/isdn_ppp.h  
't' 90-91 linux/toshiba.h toshiba
'u' 00-1F linux/smb_fs.h gone
'u' 20-3F linux/uvcvideo.h USB
'u' 40-4f linux/udmabuf.h userspace
'v' 00-1F linux/ext2_fs.h conflict!
'v' 00-1F linux/fs.h conflict!
'v' 00-0F linux/sonypi.h conflict!
'v' 00-0F media/v4l2-subdev.h conflict!
'v' 20-27 arch/powerpc/include/uapi/asm/vas-api.h VAS
'v' C0-FF linux/meye.h conflict!
'w' all CERN SCI
'y' 00-1F   packet based user level communications
 <mailto:zapman@interlan.net>
'z' 00-3F   CAN bus card conflict!
 <mailto:hdstich@connectu.ulm.circular.de>
'z' 40-7F   CAN bus card conflict!
<mailto:oe@port.de>
'z' 10-4F drivers/s390/crypto/zcrypt_api.h conflict!
'|' 00-7F linux/media.h  
0x80 00-1F linux/fb.h  
0x89 00-06 arch/x86/include/asm/sockios.h  
0x89 0B-DF linux/sockios.h  
0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE
0x89 E0-EF linux/dn.h PROTOPRIVATE
0x89 F0-FF linux/sockios.h SIOCDEVPRIVATE
0x8B all linux/wireless.h  
0x8C 00-3F   WiNRADiO driver
<http://www.winradio.com.au/>
0x90 00 drivers/cdrom/sbpcd.h  
0x92 00-0F drivers/usb/mon/mon_bin.c  
0x93 60-7F linux/auto_fs.h  
0x94 all fs/btrfs/ioctl.h Btrfs
  and linux/fs.h some
0x97 00-7F fs/ceph/ioctl.h Ceph
0x99 00-0F   537-Addinboard driver
<mailto:buk@buks.ipn.de>
0xA0 all linux/sdp/sdp.h Industrial Device Project
 <mailto:kenji@bitgate.com>
0xA1 0 linux/vtpm_proxy.h TPM
0xA3 80-8F   Port ACL  in development:
<mailto:tlewis@mindspring.com>
0xA3 90-9F linux/dtlk.h  
0xA4 00-1F uapi/linux/tee.h Generic
0xAA 00-3F linux/uapi/linux/userfaultfd.h  
0xAB 00-1F linux/nbd.h  
0xAC 00-1F linux/raw.h  
0xAD 00    Netfilter device in development:
<mailto:rusty@rustcorp.com.au>
0xAE 00-1F linux/kvm.h Kernel-based Virtual Machine
<mailto:kvm@vger.kernel.org>
0xAE 40-FF linux/kvm.h Kernel-based Virtual Machine
<mailto:kvm@vger.kernel.org>
0xAE 20-3F linux/nitro_enclaves.h Nitro
0xAF 00-1F linux/fsl_hypervisor.h Freescale
0xB0 all    RATIO devices in development:
 <mailto:vgo@ratio.de>
0xB1 00-1F    PPPoX
 <mailto:mostrows@styx.uwaterloo.ca>
0xB3 00 linux/mmc/ioctl.h  
0xB4 00-0F linux/gpio.h <mailto:linux-gpio@vger.kernel.org>
0xB5 00-0F uapi/linux/rpmsg.h <mailto:linux-remoteproc@vger.kernel.org>
0xB6 all linux/fpga-dfl.h  
0xB7 all uapi/linux/remoteproc_cdev.h <mailto:linux-remoteproc@vger.kernel.org>
0xC0 00-0F linux/usb/iowarrior.h  
0xCA 00-0F uapi/misc/cxl.h  
0xCA 10-2F uapi/misc/ocxl.h  
0xCA 80-BF uapi/scsi/cxlflash_ioctl.h  
0xCB 00-1F   CBM serial IEC bus in development:
<mailto:michael.klein@puffin.lb.shuttle.de>
0xCC 00-0F drivers/misc/ibmvmc.h pseries
0xCD 01 linux/reiserfs_fs.h  
0xCF 02 fs/cifs/ioctl.c  
0xDB 00-0F drivers/char/mwave/mwavepub.h  
0xDD 00-3F   ZFCP device driver see drivers/s390/scsi/
 <mailto:aherrman@de.ibm.com>
0xE5 00-3F linux/fuse.h  
0xEC 00-01 drivers/platform/chrome/cros_ec_dev.h ChromeOS
0xF3 00-3F drivers/usb/misc/sisusbvga/sisusb.h sisfb (in development)
 <mailto:thomas@winischhofer.net>
0xF6 all    LTTng Linux Trace Toolkit Next Generation
 <mailto:mathieu.desnoyers@efficios.com>
0xFD all linux/dm-ioctl.h  
0xFE all linux/isst_if.h  

linux ioctl及ioctl command相关推荐

  1. Linux编程之ioctl

    在和设备驱动程序通信时,ioctl是很常用的一个调用,常用来配置.查询或者修改设备的配置.反过来说,编写驱动程序时,ioctl也是经常要实现的一个接口,以便应用程序可以方便地控制设备驱动. 应用程序中 ...

  2. Linux下解决“shutdown: command not found“问题

    Linux下解决"shutdown: command not found"问题 参考文章: (1)Linux下解决"shutdown: command not found ...

  3. Linux驱动设计ioctl函数的cmd参数不能为2

    Linux驱动程序设计的时候偶然发现的ioctl()函数的cmd参数不能为2,如果为2,ioctl()函数返回-1,网上说就是这样的,正常,不知道为什么,stack overflow上有一个外国学友的 ...

  4. linux驱动之ioctl

    大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力. 一.在用户空间,使用ioctl系统调用来控制设备,原型如下: int ioctl(int fd,unsigned long cm ...

  5. (八)linux驱动之ioctl的使用

    这篇文章给大家讲解一下ioctl的简单使用,关于ioctl更详细的教程后面有机会单独写出来 (一)什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理 ...

  6. Linux下通过ioctl修改IP信息

    通过ioctl修改和获取ip的地址.网关.掩码 #include <stdio.h> #include <string.h> #include <unistd.h> ...

  7. Linux内核驱动 --ioctl函数解析

    1.前言 当我们在讨论linux内核驱动开发时,就不得不提到ioctl这个及其重要的函数.它是字符类设备驱动程序中实现对设备控制的接口之一. ioctl是设备驱动程序中对设备的I/O通道进行管理的函数 ...

  8. linux ioctl命令,关于LINUX下的ioctl函数

    驱动程序中ioctl函数的函数原型如下: int (*ioctl)(struct inode *inode, struct file *filp,unsigned int cmd, unsigned ...

  9. Linux字符设备---ioctl详细解析

    目录 一. 什么是ioctl 二.ioctl的必要性 三. ioctl如何实现 四. cmd参数如何得出 一. 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/ ...

最新文章

  1. python 获取当前时间 时间差
  2. linux端口转发到windows,Linux及Windows基于工具的端口转发
  3. 20161228阅读笔记
  4. wxpython实现鼠标拖动事件
  5. new JSONArray(ListMap).tostring()问题
  6. 【转】Tomcat+MyEclipse
  7. python生成器迭代_二十、深入Python迭代器和生成器
  8. JDBC之数据库的连接步骤(六步)
  9. EasyRTMP实现对接海康、大华等IPCamera SDK进行RTMP推送直播功能
  10. 点菜单项在面板中打开并判断是否打开
  11. 用MATLAB画出双极性NRZ,[工学]通信原理MATLAB仿真教程第7章.ppt
  12. mysql怎么跨库查询_在MySQL中怎样进行跨库查询?
  13. 图解 Cisco IOS 命名规范
  14. 实训六 思科路由器配置静态路由
  15. 一文让你秒懂存储虚拟化
  16. Git上传本地文件到服务器,git上传文件到远程服务器
  17. linux嵌入式系统开发心得,嵌入式学习牛人心得
  18. 百度识图上线,体验以图搜图
  19. 视频号在微信生态里的定位如何?
  20. 如何使用gcore以及viewcore排查问题

热门文章

  1. maven 引入war
  2. 有传闻说,写好总结可以升职加薪?
  3. Linux系统:centos7下搭建ElasticSearch中间件,常用接口演示
  4. RedHat系列软件管理(第二版) --脚本安装
  5. MSsqlserver服务快速打开和停止
  6. 分布式开发必须了解的Zookeeper的Leader选举机制(源码解析)
  7. C#操作DataReader类
  8. Windows运行命令收集
  9. 《Python爬虫开发与项目实战》——1.6 小结
  10. SQL Server -- SQL NULL值,ISNull(),Oracal NVL(),MYSQL IFNULL(),COALESCE()