c语言ioctl函数,ioctl函数的参数和作用

1,ioctl函数的参数和作用因为用户层定义它是个变参函数ioctl (int __fd, unsigned long int __request, ...)跟printf似的
2,请教c语言ioctl函数的用法急http://baike.baidu.com/view/1081282.htm?fr=ala0_1_1
3,请教c语言ioctl函数的用法急http://baike.baidu.com/view/1081282.htm?fr=ala0_1_1这个函数本身没什么特别的,但是参数的使用跟具体设备和驱动有关系,所以其实没法解释这个东西具体该怎么用, 你要操作什么设备就得仔细去读这个设备驱动的文档再看看别人怎么说的 。【c语言ioctl函数,ioctl函数的参数和作用】
4,linux下怎么用c获取硬盘物理序列号1、在Linux系统中通过C语言获取硬盘序列号,可以借助于ioctl()函数 , 该函数原型如下:1int ioctl(int fd, unsigned long request, ...);123ioctl的第一个参数是文件标识符,用open()函数打开设备时获取 。ioctl第二个参数为用于获得指定文件描述符的标志号,获取硬盘序列号,一般指明为HDIO_GET_IDENTITY 。ioctl的第三个参数为一些辅助参数,要获取硬盘序列号,需要借助于struct hd_driveid结构体来保存硬盘信息  , 该结构体在Linux/hdreg.h中,struct hd_driveid的声明如下123456789101112131415161718struct hd_driveid unsigned short config; / lots of obsolete bit flags */unsigned short cyls; /* Obsolete, "physical" cyls */unsigned short reserved2; /* reserved (word 2) */unsigned short heads; /* Obsolete, "physical" heads */unsigned short track_bytes; /* unformatted bytes per track */unsigned short sector_bytes; /* unformatted bytes per sector */unsigned short sectors; /* Obsolete, "physical" sectors per track */unsigned short vendor0; /* vendor unique */unsigned short vendor1; /* vendor unique */unsigned short vendor2; /* Retired vendor unique */unsigned char serial_no[20]; /* 0 = not_specified */unsigned short buf_type; /* Retired */unsigned short buf_size; /* Retired, 512 byte increments* 0 = not_specified*/……};2、源代码如下12345678910111213141516171819202122232425#include <stdio.h>//ioctl()的声明头文件#include <sys/ioctl.h>//硬盘参数头文件,hd_driveid结构声明头文件#include <linux/hdreg.h>//文件控制头文件#include <sys/fcntl.h>int main() //用于保存系统返回的硬盘数据信息 struct hd_driveid id; //这里以第一块硬盘为例,用户可自行修改 //用open函数打开获取文件标识符,类似于windows下的句柄 int fd = open("/dev/sda", O_RDONLY|O_NONBLOCK); //失败返回 if (fd < 0) perror("/dev/sda"); return 1; } //调用ioctl() if(!ioctl(fd, HDIO_GET_IDENTITY, &id)) printf("Serial Number=%s\n",id.serial_no); } return 0;}编译完成后,执行效果如下:5,请问程序中ioctl函数的功能是什么使用i2c通信先配置地址,数据位,超时时间等等通信规则 。这里的ioctl函数就是用来配置这些参数的 。I2C_SLAVE:安全的配置,如果i2c已经配置过会返回失败 。I2C_SLAVE_FORCE:总是成功,不管其他人有没有在使用,确定只有你使用这个i2c的时候使用 。同时ioctl还能使用I2C_TENBIT,I2C_PEC,I2C_TIMEOUT等参数 。这里只是配置i2c通信规则,还没有发送数据 。配置完成后,调用write,read函数可以接收发送数据 。ioctl是设备驱动程序中对设备的i/o通道进行管理的函数 。所谓对i/o通道进行管理,就是对设备的一些特性进行控制 , 例如串口的传输波特率、马达的转速等等 。它的参数个数如下:int ioctl(int fd, int cmd, …);其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令 , 至于后面的省略号,那是一些补充参数 , 一般最多一个,有或没有是和cmd的意义相关的 。ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就能在用户程序中使用ioctl函数控制设备的i/o通道 。6,ioctl怎么使用BOOL IOCtl(longlCommand,DWORD* lpArgument );DWORD dwParam = 0 ;DWORD* pAug = &dwParam .1. cmd = FIOBIO*pAug = 1 ; // 非0值表示设置ioctl为非阻塞*pAug = 0 ; // 0表示设置ioctl为阻塞.pAug用于设置. 2. cmd = FIONREAD*pAug = operational result // pAug存储的是读取的结束// 如果socket = sock_stream, *pAug = bytes read(读取的字节数)// 如果socket = sock_datagram, *pAug = 第一个数据包(datagram)的大小 pAug用于接收3. cmd = SIOCATMARK*pAug = read result// 如果没有重要的数据等待读取,操作返回非0值// 否则返回0pAug用于接收static int motor_driver_ioctl(struct inode *inode, struct file *file, unsigned int cmd,unsigned long arg)get_user(val,(int __user*)arg);//内核空间不能直接取用户空间的指针的 switch (cmd){在windows系统中应用程序不能直接访问硬件,必须通过驱动程序 , 而硬件千变万化 , 相应的驱动程序也有很大的变化,操作系统必须有一个抽象的层次来弥合应用程序和驱动程序 。windows系统沿用了unix系统中的概念,在unix系统中,一切外部资源都是文件,文件可以很好的抽象硬件,对于系统核心而言 , 一切外设不过就是输入输出的数据,类同于文件操作 。在windows中提供一切应用程序访问硬件的api就是我们熟知的文件操作函数,就是createfile,openfile,readfile,writefile,等等 , 他还有一个特殊的函数,理论上并不需要这个函数,但是有了这个函数可以简化应用程序设计,就iocontrol 。它可以让应用程序向外设发送指令(实际上,writefile完全可以替代它的用途) 。这些基本的访问驱动程的api构成了基础的抽象,其他的应用程序api也要通过这些函数来访问外设,只是他们根据特定的用途进行了特化,比如winsock他最终访问网卡还是要通过这些基本的io函数的 。ioctl错误,就是说应用程序在调用iocontrol这个函数的时候发生了故障,可能是硬件故障,也可能是错误的驱动程序,或者这个u盘不支持标准的格式化方式 。