【问题标题】:C program designed to restart itself in Solaris旨在在 Solaris 中重新启动自身的 C 程序
【发布时间】:2013-07-16 07:02:26
【问题描述】:

我的 C 程序在 Solaris 上运行,并且在某些情况发生时需要自行重启,例如接收到信号。现在考虑用exec族函数来实现这个特性,有3个问题:

  1. 我知道在执行之前应该关闭文件描述符,但是程序使用了一些第三方库,这些库也打开了文件,那么我该如何关闭这些文件描述符呢?
  2. 除了文件描述符,还有什么系统资源需要释放吗?
  3. 除了 exec 系列函数,还有其他方法可以实现这个函数吗?

【问题讨论】:

  • 想想共享内存段(System V IPC 风格)和类似的事情。如果程序不使用它们,没问题。如果是这样,它们需要清理吗?这取决于程序以及如果发现它通常创建的资源已经存在,它会做什么。

标签: c unix solaris


【解决方案1】:

我将有 2 个程序...一个是第二个的启动器。启动器正在等待第二个程序的返回值,并根据该值决定是否重新启动它。

【讨论】:

    【解决方案2】:

    POSIX spec for the exec family of functions 确切地告诉您应该担心什么。仔细阅读说明部分,看看是否有什么对您很重要(例如信号处理)。我不认为需要释放文件描述符以外的任何资源。

    没有办法关闭所有文件描述符——也没有设置它们的 close-on-exec 标志——除了知道它们是什么或遍历所有文件描述符。请参阅(例如)this answer

    我同意另一个答案,一个更好的主意是有一个“观察者”进程或脚本,在主程序终止时重新启动它。

    [更新]

    虽然没有标准 (POSIX) 方法来枚举和/或关闭所有打开的文件描述符,但有一个特定于 Solaris 的接口来执行此操作。 (这对我来说是个新闻。)见下面的alanc's comment

    【讨论】:

    • 由于问题指定了 Solaris,libc 提供了一个循环遍历所有文件描述符的函数,以及另一个使用该循环从给定点关闭所有文件的函数(就像所有经过 stderr 的内容一样) - 请参阅 docs.oracle.com/cd/E26502_01/html/E29034/closefrom-3c.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 2022-01-12
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多