当前位置: 首页 > news >正文

怀化建设企业网站有哪些免费的视频网站

怀化建设企业网站,有哪些免费的视频网站,wordpress根目录修改主题,网上申请公司注册流程文章目录 1、ioctl简介2、示例程序编写2.1、应用程序编写2.2、驱动程序编写 3、ioctl命令的构成4、测试 1、ioctl简介 ioctl(input/output control)是Linux中的一个系统调用,主要用于设备驱动程序与用户空间应用程序之间进行设备特定的输入/…

文章目录

  • 1、ioctl简介
  • 2、示例程序编写
    • 2.1、应用程序编写
    • 2.2、驱动程序编写
  • 3、ioctl命令的构成
  • 4、测试

1、ioctl简介

ioctl(input/output control)是Linux中的一个系统调用,主要用于设备驱动程序与用户空间应用程序之间进行设备特定的输入/输出操作。它提供了一种通用的机制,允许用户空间的应用程序通过文件描述符与设备进行交互,以执行标准文件操作(如读取、写入、打开和关闭)之外的特殊操作。

2、示例程序编写

本次示例程序包括应用程序和驱动程序。

2.1、应用程序编写

应用程序中,将用户输入的数据通过ioctl()传入到驱动程序,并通过ioctl()读取出来。

/* ioc_test.c */#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>// 定义设备类型和 ioctl 命令
#define IOC_MAGIC  'M'
#define MY_IOCTL_GET_PARAM _IOR(IOC_MAGIC, 0, int)
#define MY_IOCTL_SET_PARAM _IOW(IOC_MAGIC, 1, int)int main() 
{int fd;int param;int getparam;/* 1、打开设备节点 */fd = open("/dev/ioc", O_RDWR);if (fd < 0) {perror("open");return -1;}/* 2、获取用户输入 */  fprintf(stdout, "entry the number : ");scanf("%d", &param);/* 3、写入参数 */if (ioctl(fd, MY_IOCTL_SET_PARAM, &param) < 0) {perror("ioctl");close(fd);return -1;}/* 4、读出参数 */if (ioctl(fd, MY_IOCTL_GET_PARAM, &getparam) < 0) {perror("ioctl");close(fd);return -1;}fprintf(stdout, "getparam = %d\n", getparam);// 关闭文件close(fd);return 0;
}

2.2、驱动程序编写

重点主要有如下两个部分:

1、file_operations中指定ioctl操作函数:

static struct file_operations ioc_drv = {.owner	 = THIS_MODULE,.open    = ioc_drv_open,.read    = ioc_drv_read,.write   = ioc_drv_write,.release = ioc_drv_close,.unlocked_ioctl = my_device_ioctl,
};

2、填充ioctl函数:

#define IOC_MAGIC  'M'
#define MY_IOCTL_GET_PARAM _IOR(IOC_MAGIC, 0, int)
#define MY_IOCTL_SET_PARAM _IOW(IOC_MAGIC, 1, int)static long my_device_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 
{static int param = 0;switch (cmd) {/* 设置参数命令 */case MY_IOCTL_SET_PARAM:printk(KERN_INFO "MY_IOCTL_SET_PARAM\n");if (copy_from_user(&param, (int __user *)arg, sizeof(param))) {return -EFAULT;}printk(KERN_INFO "my_device: set param to %d\n", param);break;/* 读取参数命令 */case MY_IOCTL_GET_PARAM:printk(KERN_INFO "MY_IOCTL_GET_PARAM\n");if (copy_to_user((int __user *)arg, &param, sizeof(param))) {return -EFAULT;}printk(KERN_INFO "my_device: get param %d\n", param);break;default:return -EINVAL; }return 0;
}

3、完整的驱动程序如下:

/* ioc_drv.c */#include <linux/module.h>#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>static int major = 0;
static struct class *ioc_class;#define IOC_MAGIC  'M'
#define MY_IOCTL_GET_PARAM _IOR(IOC_MAGIC, 0, int)
#define MY_IOCTL_SET_PARAM _IOW(IOC_MAGIC, 1, int)static long my_device_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 
{static int param = 0;switch (cmd) {case MY_IOCTL_SET_PARAM:printk(KERN_INFO "MY_IOCTL_SET_PARAM\n");if (copy_from_user(&param, (int __user *)arg, sizeof(param))) {return -EFAULT;}printk(KERN_INFO "my_device: set param to %d\n", param);break;case MY_IOCTL_GET_PARAM:printk(KERN_INFO "MY_IOCTL_GET_PARAM\n");if (copy_to_user((int __user *)arg, &param, sizeof(param))) {return -EFAULT;}printk(KERN_INFO "my_device: get param %d\n", param);break;default:return -EINVAL; }return 0;
}static ssize_t ioc_drv_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
{printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}static ssize_t ioc_drv_write (struct file *file, const char __user *buf, size_t size, loff_t *offset)
{printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}static int ioc_drv_open (struct inode *node, struct file *file)
{printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}static int ioc_drv_close (struct inode *node, struct file *file)
{printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}static struct file_operations ioc_drv = {.owner	 = THIS_MODULE,.open    = ioc_drv_open,.read    = ioc_drv_read,.write   = ioc_drv_write,.release = ioc_drv_close,.unlocked_ioctl = my_device_ioctl,
};static int __init ioc_init(void)
{int err;printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);major = register_chrdev(0, "ioc", &ioc_drv);ioc_class = class_create(THIS_MODULE, "ioc_class");err = PTR_ERR(ioc_class);if (IS_ERR(ioc_class)) {printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);unregister_chrdev(major, "ioc");return -1;}device_create(ioc_class, NULL, MKDEV(major, 0), NULL, "ioc"); /* /dev/ioc */return 0;
}static void __exit ioc_exit(void)
{printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);device_destroy(ioc_class, MKDEV(major, 0));class_destroy(ioc_class);unregister_chrdev(major, "ioc");
}module_init(ioc_init);
module_exit(ioc_exit);MODULE_LICENSE("GPL");

3、ioctl命令的构成

一个完整的ioctl命令码通常包含以下几个字段:

  1. 设备类型(通常是8位):用于标识设备或设备驱动程序的类型。这使得系统能够区分不同的设备或设备组。
  2. 序列号(也是8位):在同一设备类型下,用于区分不同的ioctl命令。每个命令都有一个唯一的序列号,以确保命令的唯一性。
  3. 方向位(2位):指示数据传输的方向。这可以是读操作、写操作或读写操作。方向位帮助设备驱动程序了解用户空间程序期望执行的操作类型。
  4. 数据大小(8~14位):指定用户空间与内核空间之间传输的数据的大小。这确保了数据在传输过程中的完整性和一致性。

在Linux内核中,为了简化ioctl命令的创建过程,提供了一些宏定义。可以看到在上面的应用程序和驱动程序中,都使用了宏来创建ioctl命令:

#define IOC_MAGIC  'M'
#define MY_IOCTL_GET_PARAM _IOR(IOC_MAGIC, 0, int)
#define MY_IOCTL_SET_PARAM _IOW(IOC_MAGIC, 1, int)

可用的宏有如下:

// _IO宏用于创建不带数据传输的ioctl命令
// type是设备类型,通常是一个字符常量,用于区分不同的设备或设备驱动程序
// nr是命令序号,用于在同一设备类型下区分不同的命令
#define _IO(type,nr)        _IOC(_IOC_NONE,(type),(nr),0)// _IOR宏用于创建从设备读取数据的ioctl命令
// type和nr的含义与_IO宏相同
// size是数据类型大小
#define _IOR(type,nr,size)  _IOC(_IOC_READ,(type),(nr),sizeof(size))// _IOW宏用于创建向设备写入数据的ioctl命令
// 其他参数的含义与_IOR宏相同
#define _IOW(type,nr,size)  _IOC(_IOC_WRITE,(type),(nr),sizeof(size))// _IOWR宏用于创建既读取又写入数据的ioctl命令
// 其他参数的含义与_IOR和_IOW宏相同
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))

4、测试

1、编译驱动程序,加载驱动程序。

2、编译应用程序,运行应用程序。

http://www.yayakq.cn/news/704890/

相关文章:

  • 灯饰 技术支持 东莞网站建设媒体宣传推广方案
  • 备案名称和网站logo不一致wordpress网站怎么加小游戏
  • 网站建设首页包括什么门户网站 建设 北京 航天
  • 在线网站建设平台哪个好什么亲子网站可以做一下广告词
  • 网站版心怎么做网页型网站
  • 企业网站管理系统排名裕安区韩摆渡镇
  • 能看网站的视频app中国做视频网站有哪些内容
  • 百度一下建设部网站修改wordpress数据库
  • 电话销售的10个小技巧百度关键词优化查询
  • 网站开发技术分享ppt网络推广公司加盟
  • 国内域名注册商给网站做排名优化学什么好
  • 品牌网站建设意义企业查询系统官网入口
  • 龙岗爱联有学网站建设北京网站建设公司优势
  • 天津做网站找哪家公司好深圳谷歌seo培训班
  • 淘客做的网站属于什么类型软件类专业有哪些
  • 沈阳网站制作 600元佛山网站建设费用
  • 重庆 网站 建设wordpress文章推送邮箱
  • 做外贸企业网站要注意哪些中山网站建设价位
  • wordpress卖邀请码链接南昌seo推广外包
  • wordpress站点结构做外贸没网站可以吗
  • 各种网站开发语言的优缺点微信自己开发小程序
  • 如何用手机做钓鱼网站威海 网站开发
  • 织梦m网站伪静态做网站和优化共多少钱
  • 济南网站建设公司有哪些国外搜索引擎排名百鸣
  • 湛江网站建设电话如何做自己的淘宝网站
  • 网站开发 工具wordpress 弹框
  • 搭建个人网站的两种方法网站如何自己做优化
  • 众网站阿里云oss可以做网站
  • 哪种语言做网站最合适网上商城开发费用
  • 有后台的网站中国联通网站备案管理系统