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

时间:2016-02-25 21:50:08

标签: c++ linux fork file-descriptor child-process

我的C ++程序在Linux下运行,运行了很多子进程,并且在每个fork之后运行子进程,我关闭所有继承的fds以防止子进程访问它们。现在,我的程序也从其父级继承了一些fds,在程序启动时关闭所有继承的fds比在每个fork之后反复关闭它们更有意义。

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

1 个答案:

答案 0 :(得分:0)

  1. 从您的问题中不清楚:您是否只是调用fork()或者在fork()之后添加调用execve()? 如果调用execve(),O_CLOEXEC标志应该可以帮到你。您可以在execve()后通过fcntl()syscall或通过将O_CLOEXEC传递给创建fds的系统调用来设置您不会保留的描述符。

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