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 ...
随机推荐
- 关于 Intel CPU 和Iris Xe Graphics的报告问题
关于 Intel CPU 和Iris Xe Graphics的报告问题 有些用户报告了一些技术问题,这里有更多的信息和如何解决. Intel 11th CPU & Iris Xe Graphi ...
- element ui table 表格排序
实现elementui表格的排序 1:给table加上sort-change,给table每一项加上sortable和column-key,排序是根据column-key来进行排序的 <el-t ...
- leetcode 54. 螺旋矩阵 及 59. 螺旋矩阵 II
54. 螺旋矩阵 问题描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, ...
- 使用PostGIS完成两点间的河流轨迹及流经长度的计算
基础准备工作 1.PostGIS 的安装 在安装PostGIS前首先必须安装PostgreSQL,然后再安装好的Stack Builder中选择安装PostGIS组件.具体安装步骤可参照 PostGI ...
- 微信小程序云开发指南
一.初识云开发 官方文档 小程序·云开发是微信团队联合腾讯云推出的专业的小程序开发服务. 开发者可以使用云开发快速开发小程序.小游戏.公众号网页等,并且原生打通微信开放能力. 开发者无需搭建服务器,可 ...
- 基础概念(2):怎么用cc来编译?
怎么用cc来编译? 总结卡片: cc的使用可以很简单,指定要转换的程序文件就可以了,比如:cc hello.c. 按cc的规则(我这里是clang-llvm),程序文件以.c或.cpp为后缀. cc有 ...
- JuiceFS 在理想汽车的使用和展望
理想汽车是中国新能源汽车制造商,设计.研发.制造和销售豪华智能电动汽车,于 2015 年 7 月创立,总部位于北京,已投产的自有生产基地位于江苏常州,通过产品创新及技术研发,为家庭用户提供安全及便捷的 ...
- atan2(y,x)和pow(x,y)
atan2(y,x): 函数atan2(y, x)是4象限反正切,求的是y/x的反正切,其返回值为[-π,+π]之间的一个数.它的取值不仅取决于正切值y/x,还取决于点 (x, y) 落入哪个象限: ...
- gin源码解读1-net/http的大概流程
gin框架预览 router.Run()的源码: func (engine *Engine) Run(addr ...string) (err error) { defer func() { debu ...
- golang中为何在同一个goroutine中使用无缓冲通道会导致死锁
package main import "fmt" func main() { /* 以下程序会导致死锁 c := make(chan int) c <- 10 n1 := ...