在程序启动时关闭所有继承的 fds

Close all inherited fds at program start

本文关键字:继承 fds 程序 启动      更新时间:2023-10-16

我的C++程序在Linux下运行,运行了很多子进程,每次fork运行子进程后,我都会关闭所有继承的fds以防止子进程访问它们。现在,我的程序也从其父级继承了一些 fd,在程序启动时关闭所有这些继承的 fds 比在每次fork后一遍又一遍地关闭它们更有意义。

问题是,我真的不知道哪些 fds 实际上是继承的,哪些是我的。当我在main()时,很多代码已经运行,程序可能已经创建了自己的一些fds(例如,在库,静态对象等的初始化期间)。那么我怎么能只关闭继承的 fds呢?

  1. 从你的问题中不清楚:你是只调用 fork() 还是在 fork() 之后附加调用 execve()?如果调用 execve(),O_CLOEXEC标志应该对您有所帮助。您可以在 execve() 之后不打算保留的描述符上设置此标志,通过 fcntl() 系统调用或将O_CLOEXEC传递给创建 fds 的系统调用。

  2. 如果你不调用execve(),你将完全继承父级的状态。如果文件描述符是"你的",那么它已经存储在你的数据结构中的某个地方。因此,您可以迭代这些结构并处理与您的需求相对应的描述符。