/*
当用户空间调用open()的时候,这个函数最终会被调用。
这个函数主要:
将打开文件的f_op替换成了input_handler中定义的fops
如果以后用户层调用read、write、ioctl....系统调用,
那么input_handler中fops中定义的对应方法会被调用到
vfs_read:
ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
....
if (file->f_op->read){
ret = file->f_op->read(file, buf, count, pos);
}
....
}
如: evdev中这些方法会被调用到。
static const struct file_operationsevdev_fops = {
.owner = THIS_MODULE,
.read = evdev_read,
.write = evdev_write,
.poll = evdev_poll,
.open = evdev_open,
.release = evdev_release,
.unlocked_ioctl = evdev_ioctl,
};
这个函数和v4l2、framebuffer子系统中的open函数有点类似 .
v4l2、framebuffer的一些函数以前博文中有分析过。这里就简单的列举一下。
比如 : v4l2:
当用户层调用open()的时候,v4l2_open()也会被调用
static int v4l2_open(struct inode *inode, struct file *filp)
{
struct video_device *vdev;
...
vdev = video_devdata(filp); 也是从一个数组中取出对应的video_device
if (vdev->fops->open) {
ret = vdev->fops->open(filp); //也是调用具体设备提供的操作方法
}
}
不一样的是,在open函数中没有替换file->f_op,它使用的是另外一种策略
在看fb
fb_open(struct inode *inode, struct file *file)
{
int fbidx = iminor(inode);
struct fb_info *info;
int res = 0;
info = get_fb_info(fbidx); //也是从一个数组中获取对应的fb_info
file->private_data = info;
//也是调用了具体设备提供的操作函数
if (info->fbops->fb_open) {
res = info->fbops->fb_open(info,1);
}
}
*/
static int input_open_file(struct inode * inode,struct file *file)
{
struct input_handler * handler;
const struct file_operations *old_fops,*new_fops = NULL;
int err;
/**
获取互斥锁----访问临界区----释放互斥锁
*/
//获取互斥锁,可以被信号打断,在等待锁的过程中
//如果有信号的到来,该函数返回-EINTR
err = mutex_lock_interruptible(&input_mutex);
if (err)
{
return err;
}
/**
minor(ionde) :获取次设备号
从input_table[]中获取对应的input_handler
好,看看input_table[]
一指针数组
static struct input_handler *input_table[8];
在什么时候被填充?
在时间处理层 向核心层 注册input_handler的时候
int input_register_handler(struct input_handler *handler)
{
//如果这个被注册的input_handler提供了file_operations
if (handler->fops != NULL) {
if (input_table[handler->minor >> 5])
{
retval = -EBUSY;
goto out;
}
//将这个被注册的input_handler依据次设备号位索引值放入到input_table[]中
//这个minor = input_table[]中空缺项的索引值
input_table[handler->minor >> 5] = handler;
}
}
在void input_unregister_handler(struct input_handler *handler)
{
....
//从input_table[]中删除
if (handler->fops != NULL){
input_table[handler->minor >> 5] = NULL;
}
}
*/
handler = input_table[minor(inode)>>5];
if (handler)
{
/**
将取出来的input_handler的fops赋值给new_fops
例如:evdev
input_handler:
static struct input_handler evdev_handler = {
.event = evdev_event,
.connect = evdev_connect,
.disconnect = evdev_disconnect,
.fops = &evdev_fops,
.minor = EVDEV_MINOR_BASE,
.name = "evdev",
.id_table = evdev_ids,
};
fops:
static const struct file_operations evdev_fops = {
.owner = THIS_MODULE,
.read = evdev_read,
.write = evdev_write,
.poll = evdev_poll,
.open = evdev_open,
.release = evdev_release,
.unlocked_ioctl = evdev_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = evdev_ioctl_compat,
#endif
.fasync = evdev_fasync,
.flush = evdev_flush,
.llseek = no_llseek,
};
*/
//比如 现在的new_fops 等价于 evdev_fops
new_fops = fops_get(handler->fops);
}
mutex_unlock(&input_mutex);//释放互斥体
/**
如果取出来的input_handler中没有定义fops
或者定义了fops,但是fops中没有定义open函数,那么会失败返回
*/
if (!new_fops || !new_fops->open)
{
fops_put(new_fops);
err = -ENODEV;
goto out;
}
old_fops = file->f_op;
/**
将取出来的input_handler的fops赋给 打开文件的f_op
如果是evdev :这样,以后使用到文件的f_op就变成了 evdev_fops
*/
file->f_op = new_fops;
/**
调用这个input_handler中定义的fops中的open函数
如果input_handler是evdev的话,evdev_open函数就会被调用
*/
err = new_fops->open(inode, file);
if (err) {
fops_put(file->f_op);
file->f_op = fops_get(old_fops);
}
fops_put(old_fops);
}
相关推荐
ffmpeg源码分析之open_input_file
open_input_file函数是被open_files函数调用,在调用之前open_files函数将解析得到的输入相关参数存入到 OptionsContext o中,以ffmpeg -f v4l2 -i /dev/video0 test.mp4为例,其实就是-f v4l2 -i /dev/video0, 其中 -f v4l2通过parse_optgroup函数来解析,这里主要还是跟options中对f参数的定义相关的,会去根据这些定义来进行相关的操作(write_option函数),write_o..
Linux内核LCD驱动分析(一)
LCD驱动其实也是字符型驱动的一种,只不过是结构上没有那么明显,细细的看下来其实还是可以看出来的。 在Linux内核中,LCD驱动又叫FrameBuffer驱动,即帧缓冲子系统。在内核代码中,其源码是drivers/video/fbdev/core/fbmem.c static int __init fbmem_init(void) { int ret; if (!proc_create("...
【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目
打开前端项目的vue.config.js文件,检查devServer下的proxy代理部分,然后将下面这个端口修改为你要在打包后访问的端口,即使用nginx代理前的接口。这个端口默认是80端口,这里把其修改为不会冲突的8010端口,后台接口的地址配置为9080,不过感觉这里设置的8010和9080可能没有用,因为部署前端静态页面是,也配置了一次网页的外部接口和api的接口,后期有空了再验证。打开右侧的Maven,点击:生存期->package,然后点击运行,等待打包成功,包在如图所示的文件夹中。
fb分析
一句话总结:先分析下fbmem.c文件,它是该子系统的核心,接收驱动提供的fb_info结构体;然后看三星s3c系列SOC驱动的实现,其内部向上提供fb_info结构体,对下有一个s3cfb_init_hw函数需要具体机型实现;接着到了我们用的具体SOC为s3c6410,三星也给出了一个实现模版实现了对上的s3cfb_init_hw函数,同时将最后剩下的变量至于一个头文件中,所以对于我们移植到不同
H5 获取手机GPS坐标
只要手机有GPS模块,可以用HTML5的Geolocation接口获取 在HTML5中,geolocation作为navigator的一个属性出现,它本身是一个对象,拥有三个方法: getCurrentPosition watchPosition clearWatch 1.简单 function getLocation(){ if(navigator.geolocation){ //判断是否有这个对象 navigator.geoloc
世界模型和大语言模型结合开发自动驾驶算法
摘要:自动驾驶系统开发中,融合世界模型和大语言模型可显著提升效率和安全性。世界模型负责环境感知与预测(如目标检测、轨迹预测),而大语言模型优化代码生成、决策解释等环节。实施路径包括需求分析(1-2周)、模型开发(2-4个月)、模拟测试(1-2个月)、实车测试(2-3个月)和合规优化(1-2个月),总周期6-12个月。关键技术工具包括PyTorch/TensorFlow、CARLA模拟器和ROS系统,核心设计理念强调模块化、安全优先和敏捷迭代。示例代码展示了YOLO目标检测与大语言模型决策建议的集成方案。该方
open_input_file打开输入文件
open_input_file打开输入文件
有关SPSS中Fisher精确检验无法进行的解决方法(由于无法打开临时文件,因此无法进行计算)
最近在帮一个四年生完成她的毕业论文,在用SPSS进行R×C表检验的时候,发现Fisher精确检验的结果无法显示,提示为“由于无法打开临时文件,因此无法进行计算”,大概像下图一样。 (这图是从网上找的) 然...
显示屏驱动(5) - 框架层
继上篇继续分析。驱动第一层frame buffer框架层(fbmem.c)。 2.1 提供给外部模块的注册接口 int register_framebuffer(struct fb_info *fb_info) { int ret; ret = do_register_framebuffer(fb_info); return ret; } static int do_register_framebuffer(struct fb_info *fb_info) { int i; ...
基于STM32的无人机智能避障与路径规划系统设计
本文详细介绍了基于STM32的无人机智能避障与路径规划系统设计,涵盖硬件选型、传感器组合、软件架构及算法实现。通过多传感器数据融合和改进的VFH+算法,系统在复杂环境中实现92%以上的避障成功率。STM32微控制器的实时性和低功耗特性为无人机自主导航提供了可靠保障,适用于工业巡检、仓储物流等场景。
如何将 Fiori Elements Object Page Header 工具栏里按钮用 JavaScript 代码设置成禁用状态
本文介绍了如何在SAP Fiori Elements应用中动态控制Object Page工具栏按钮的可用状态。通过UI5 Inspector工具分析发现,这些按钮的enabled属性都双向绑定到/ui/enabled模型字段。在StatusExt.controller.js中,通过获取按钮ID前缀拼接完整控件ID,使用setEnabled(false)方法即可禁用按钮。关键点包括:1)使用extensionAPI获取视图ID前缀;2)注意事件回调中的this上下文绑定;3)通过修改模型字段可同步更新所有绑定
open_input_file()函数介绍
open_input_file()本问介绍ffmpeg_opt.c中的open_input_file()函数,此函数主要就是将命令行参数中的输入文件的对应参数进行设置,并打开所有输入文件 open_input_file open_files函数 输入文件涉及到的几个结构体 open_input_file函数 open_files()函数在介绍open_input_file()函数之前先介绍一下ope
智算中心建设项目初步设计方案
本项目面向区级政府、智算中心及文旅从业者,聚焦某区智算中心一期建设,响应数字经济与智慧城市建设政策,推动文旅产业升级。遵循统筹规划、数据驱动原则,目标打造智慧文旅样板。建设内容涵盖云网数据底座(以租代建)、数据中台(全生命周期管理)、智慧文旅平台(含“一机游”电商)及气象监测等配套,采用前后端架构与低代码开发,强化三级等保与纵深防御,实现安全可控。方案融合多类资源目录,提供从设计到运营的完整技术支撑,助力区域智算与文旅深度融合。
FFmepg源码系列-avformat_open_input()
本文介绍了FFmpeg中avformat_open_input()函数的核心功能,包括打开媒体文件、识别格式、创建流结构等。深入分析了复用(demuxing)和解复用(muxing)的概念、区别及实现方式。重点讲解了AVFormatContext实体,详细说明其关键字段如流信息、时间参数、控制标志等。文章还预告了后续将转向FFmpeg源码分析系列,为开发者提供更深入的技术参考。
译码器Multisim电路仿真汇总——硬件工程师笔记
本文详细介绍了74LS139D和74LS138D两种TTL译码器的功能特点及应用。74LS139D是2线-4线译码器,具有低电平有效输出和使能控制功能,常用于地址译码和数据分配。74LS138D是3线-8线译码器,通过3位输入实现8路输出控制,广泛应用于微处理器系统。文中提供了两种芯片的引脚说明、真值表和典型应用电路,并附有硬件工程师笔试面试相关资源链接。这些基础知识对数字电路设计和硬件工程师面试准备具有重要参考价值。
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
ffmpeg源码分析-open_input_file
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习 本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8 ffmpeg 源码分析系列以一条简单的命令开始,ffmpeg-i a.mp4 b.flv,分析其内部逻辑。 a.mp4下载链接:百度网盘,提取码:nl0s 。..
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
FFMPEG函数open_input_file()
2019独角兽企业重金招聘Python工程师标准>>> ...
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
Keil 编译报错 “cannot open source input file“ 解决指南
本文深入分析Keil编译报错'cannot open source input file'的根本原因,涵盖Include Paths机制、工程文件管理、相对与绝对路径问题,以及跨平台构建中的常见陷阱,帮助开发者从工程结构层面彻底解决问题。
linux下执行php文件Could not open input file的解决办法
今天在linux系统运行PHP 文件时出现报错,Could not open input file: start 如下图: 解决方法,发现是命令格式错误。 php 文件名 start 成功解决。 ...
Could not open input file: artisan解决办法
执行Laravel的artisan命令时报错,提示:Could not open input file: artisan。 错误原因是命令执行目录不对,必须要在Laravel项目的根目录执行artisan命令,CD切换到Laravel项目根目录再次执行即可。
ffmpeg源码分析之三avformat_open_input()上
URLProtocol ff_file_protocol = { .name = "file", .url_open = file_open, .url_read = file_read, .url_write = file_write, .url_seek
PHP命令行提示“Could not open input file”解决方法
在windows下用命令符运行php代码,寻思能直接出结果,结果报了如下错误: Could not open input file: echo`ipconfig`; 解决方法 原因其实也是很简单,php命令行使用方法不正确而已,PHP命令行正确使用方法如下: 第一种方法:让 PHP 运行指定文件 F:\phpStudy>php my_script.php ...
《笨办法学 python3》系列练习计划——12.提示别人 input() 打印提示
题目 前一题用 print() 打印问题,用input() 回答问题有点麻烦不是么?input() 就是要用户输入内容的,何不把提示功能加进去省去写 print() 语句的麻烦。 那我们就试试看吧 加分练习 在命令行界面下运行你的程序,然后在命令行输入pydoc input 看看它说了什么。win 下使用 python -m pydoc input 输入 q 退出 pydoc 搜索 ...
【bug记录】Could not open input file: artisan
开始以为这是PHP命令(我本地集成环境有PHP),报错之后,才了解到这是laravel 命令!报错:Could not open input file: artisan。在Laravel 项目的根目录下可以看到artisan文件。背景:安装laravel-admin执行发布资源时报错。
解决Could not open input file: composer.phar的一种方法
使用php composer.phar install命令时出现Could not open input file: composer.phar的报错,按照网上的要求将php openssl拓展打开, php.ini中;extension=php_openssl.dll 前面的分号去掉,无效.后通过everything小工具找到composer.phar的地址,将完整路径放入命令中,即: php...
945



被折叠的 条评论
为什么被折叠?



