Bash重定向如何以O_CLOEXEC打开文件防止子命令继承文件描述符
Bash重定向O_CLOEXEC特性问题与解决方案
Bash 执行重定向操作调用 open() 打开文件时,默认不支持指定 O_CLOEXEC 标志,在部分场景下会引发逻辑问题。
问题场景示例
{ flock -x 9 ./do_some_work ./do_some_more_work } 9< lock
上述场景中,do_some_work 会继承文件描述符9,如果 do_some_work 内部对fd 9执行解锁操作,会导致全局互斥锁被提前释放。
解决方案
以下是社区用户KamiCuk给出的可行方案:
{ flock -x 9 { do_work1 do_work2 } 9<&- } 9< lock
该方案的核心逻辑是在成功获取互斥锁之后,为业务逻辑的执行子块显式关闭fd 9的继承,这样内部业务进程无法拿到锁对应的文件描述符,自然不会出现意外解锁的问题,同时外层代码块仍然持有fd 9,锁的互斥能力不会受影响。
内容的提问来源于stack exchange,提问作者yuanjianpeng
相关产品推荐
相关产品推荐

