我的 C 程序在 Solaris 上运行,并且需要在某些情况发生时自行重新启动,例如接收到信号。现在考虑用exec族函数来实现这个特性,有3个问题:
- 我知道在执行之前应该关闭文件描述符,但是程序使用了一些第三方库,这些库也打开了文件,那么我该如何关闭这些文件描述符呢?
- 除了文件描述符,还有什么系统资源需要释放吗?
- 除了 exec 系列函数,还有其他实现这个函数的方法吗?
我会有 2 个程序……一个是第二个程序的启动器。启动器正在等待第二个程序的返回值,并根据该值决定是否重新启动它。
exec 系列函数的POSIX 规范准确地告诉您应该担心什么。仔细阅读说明部分,看看是否有什么对您很重要(例如信号处理)。我认为不需要释放文件描述符以外的任何资源。
除了知道它们是什么或遍历所有文件描述符之外,没有办法关闭所有文件描述符——也没有设置它们的 close-on-exec 标志。见(例如)这个答案。
我同意另一个答案,一个更好的主意是让一个“观察者”进程或脚本在主程序终止时重新启动它。
[更新]
尽管没有标准 (POSIX) 方法来枚举和/或关闭所有打开的文件描述符,但有一个特定于 Solaris 的接口来执行此操作。(这对我来说是个新闻。)请参阅下面的 alanc 评论。