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 ...
随机推荐
- Docker 与 K8S学习笔记(十 二)容器间数据共享
数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host.容器与容器之间共享数据. 一.容器与host共享数据 在上一篇中介绍到的bind mount和docker man ...
- 【原创】美团二面:聊聊你对 Kafka Consumer 的架构设计
在上一篇中我们详细聊了关于 Kafka Producer 内部的底层原理设计思想和细节, 本篇我们主要来聊聊 Kafka Consumer 即消费者的内部底层原理设计思想. 1.Consumer之总体 ...
- MATLAB的基识(整理)
%正弦函数在MATLAB中如何实现%1.sin(45°)注意:参数值需要用"弧度"去定义>>x=sin(45*pi/180);%2.MATLAB中注意:开方-sqrt( ...
- 《剑指offer》面试题18. 删除链表的节点
问题描述 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = ...
- 华为matebook x pro蓝屏和拆机更换固态硬盘
华为老版本的笔记本电脑现在总是蓝屏. 情况 原因 我个人认为是建兴的固态硬盘的缘故. 我的笔记本几乎没用过,因为考研.如果玩游戏使用的老ThinkPad S5.matebook我这个丐版因为没有独立显 ...
- Cesium入门12 - Camera Modes - 相机模式
Cesium入门12 - Camera Modes - 相机模式 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ ...
- dp问题解题思路
[基本问题单元的定义]这取决于你所查看问题的角度,找到一个划分,推进问题的角度十分重要.作者找到的方式是dp[ i ][ j ],用来表示 substring( i , j),然后站在这个角度,假设s ...
- golang中的匿名函数三种用法
package main import ( "fmt" "strconv" ) func main() { // 匿名函数的使用:方式1 f1 := func( ...
- golang中结构体指针的应用
package main import ( "fmt" ) type School struct { brand string city string } type Class s ...
- 使用 MVVM Toolkit Source Generators
关于 MVVM Toolkit 最近 .NET Community Toolkit 发布了 8.0.0 preview1,它包含了从 Windows Community Toolkit 迁移过来的以下 ...