close-on-exec 相关的一个 bug
close-on-exec 相关的一个 bug
测试一个用 V4L2 拍照的程序时,发现程序单独运行很正常,但在多进程环境下运行时就会出现问题,具体表现为执行 open
系统调用打开 /dev/video
设备时返回 EBUSY
错误,查询 V4L2 的文档可以看到该错误的含义
EBUSY
The driver does not support multiple opens and the device is already in use.
也就是说该设备不支持多次重复打开或者已经在被使用了
在程序运行时执行 lsof
,发现是一些和拍照相对无关的进程(比如 wpa_supplicant)持有着 video 设备,这些进程是肯定不会自己的去打开 video 设备的,肯定是由于某种原因从主进程中拿到了 video 的句柄
回忆一下 Linux 中执行其他程序的方式,是先执行 fork
再执行 exec
fork
的时候会拷贝父进程的文件描述符表(Linux 由于有写时拷贝,所以不会立即拷贝)- 通过
exec
打开新程序后,会替换掉fork
子进程的正文段、数据段、堆和栈,但并不会关掉已经打开的文件描述符
这种特性被 shell 用来实现 IO 重定向,比如说我们要将标准输出重定向到日志文件 log.txt
中
- shell 先
fork
出一个子 shell - 在子 shell 中关掉标准输出(即文件描述符 1),然后立即打开
log.txt
,那么log.txt
的 fd 就会是 1,因为open
是从所有可用的文件描述符中选一个最小的 - 然后调用
exec
执行 shell 命令,这样 shell 命令写到标准输出里的内容就被写入了log.txt
然而在套接字编程或使用设备时,这种特性会引来一些意想不到的 BUG
- 比如继承给新程序的套接字占了父进程的 ip 端口对,导致父进程没法使用
- 在我们这个场景中,也是因为新程序从父进程拿走了
/dev/video
的描述符,而/dev/video
本身是不允许共享的(跟驱动程序相关),导致设备使用冲突
为了解决该问题,Linux 中有一个文件描述符标志 FD_CLOEXEC
,如果某个文件描述符设定了该标志,执行 exec
期间就会自动关闭该文件描述符
- 可以通过
fcntl
的F_GETFD
和F_SETFD
参数获取和设置该标志 - 也可以在
open
时指定O_CLOEXEC
标志,它会给打开的文件描述符设置FD_CLOEXEC
close-on-exec 相关的一个 bug的更多相关文章
- memory_limit的一个bug | 风雪之隅
原文:memory_limit的一个bug | 风雪之隅 27 Nov 09 memory_limit的一个bug 作者: Laruence( ) 本文地址: http://www.laruence. ...
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- 由一个bug引发的SQLite缓存一致性探索
问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...
- 在chrome下-webkit-box布局的一个bug
chrome,也就是webkit内核下作的检测, chrome版本是40, -webkit-box这种布局在移动端用的比较多,主要是因为pc端的浏览器内核参差不齐. 因为在写HTML的时候看上了-we ...
- 从修复 testerhome(rubychina)网站的一个 bug 学习 ruby&rails on ruby
前言 testerhome: http://testerhome.com/topics/1480 对于一个差点脱离前沿技术人,想要学习ruby,就意味着要放弃熟悉的操作系统windows,熟悉的ide ...
- jquery-multiselect在ie6里的一个bug
在使用jquery-multiselect(一个把下拉框改造成带checkbox的可以多选的控件)时,正常时应该是下面这样:而它在ie6里是下面这样: 其中第一个bug参考‘ie6里png图片不透明’ ...
- sqlite在Android上的一个bug:SQLiteCantOpenDatabaseException when nativeExecuteForCursorWindow
更多内容在这里查看 https://ahangchen.gitbooks.io/windy-afternoon/content/ ::-/com.company.product W/System.er ...
- [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found
google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...
- 关于 javascript event flow 的一个bug
[1]描述了firefox,safari 有一个bug和DOM 3 规范不一致:在event.currentTarget等于event.target的时候(即event flow处于target ph ...
随机推荐
- 基于rabbitmq延迟插件实现分布式延迟任务
承接上文基于redis,redisson的延迟队列实践,今天介绍下基于rabbitmq延迟插件rabbitmq_delayed_message_exchange实现延迟任务. 一.延迟任务的使用场景 ...
- 读《疯狂Java讲义》笔记总结一
最近在读<疯狂Java讲义>,现把其中遇到的一些自己以前没掌握的点儿记录下来. 1.字符串相关 字符串不是基本类型,字符串是一个类,也就是一个引用类型. 字符串转int类型String a ...
- 《剑指offer》面试题51. 数组中的逆序对
问题描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: ...
- rocketmq实现延迟队列精确到秒级实现(总结编)
前言篇: 为了节约成本,决定通过自研来改造rocketmq,添加任意时间延迟的延时队列,开源版本的rocketmq只有支持18个等级的延迟时间, 其实对于大部分的功能是够用了的,但是以前的项目,全部都 ...
- 1120day-户别确认
1.实体类 package com.edu.empity; public class People { private String hubie; private String livetype; p ...
- JSON串、JSON对象、Java对象的相互转换2
对象类型转换: 1.Java对象-->JSON对象2.Java对象-->JSON字符串 3.JSON对象-->JSON字符串 4.JSON对象-->Java对象 5.JSON字 ...
- linux下编译支持opencl的opencv for android
主要的步骤其他人已经写过,请参考这篇:https://www.cnblogs.com/hrlnw/p/4720977.html 操作的细节请参考附件的pdf: https://files.cnblo ...
- 云图说|DDS读写两步走,带您领略只读节点的风采
摘要:为了扩展主节点的读请求能力,DDS提供具备独立连接地址的只读节点,适合独立系统直连访问,以缓解大量读请求给主节点造成的压力. 本文分享自华为云社区<[云图说]第235期 DDS读写两步走 ...
- TCP可靠性
目录 一:TCP可靠性 1.通过序列号与确认应答提高可靠性 一:TCP可靠性 简介 TCP 通过检验和.序列号.确认应答.重发控制.连接管理以及窗口控制等机制实现可靠性传输. 1.通过序列号与确认应答 ...
- 微服务架构 | 5.2 基于 Sentinel 的服务限流及熔断
目录 前言 1. Sentinel 基础知识 1.1 Sentinel 的特性 1.2 Sentinel 的组成 1.3 Sentinel 控制台上的 9 个功能 1.4 Sentinel 工作原理 ...