【问题标题】:How to restart or start a process with closing all file descriptors in C如何通过关闭 C 中的所有文件描述符来重新启动或启动进程
【发布时间】:2015-02-06 02:24:12
【问题描述】:

我想干净地重新启动我的进程。所以我试着打电话给execv()

它似乎运作良好。但是,它使套接字和文件保持打开状态。 有没有办法重新启动(这个)进程并关闭所有文件/套接字?

我不想做僵尸进程,我不使用fork()

【问题讨论】:

标签: c restart


【解决方案1】:

就像任何其他文件描述符一样,execfork 之间的套接字不会关闭。如果您希望它们关闭,您需要自己关闭它们。有三种可能的方法。

最干净的解决方案是在调用exec 之前跟踪所有套接字并关闭它们。根据您的应用程序,这可能会也可能不会。

另一种解决方案是在创建套接字后立即在套接字上设置“执行时关闭”标志,使用一对fcntl 调用(F_GETFD,添加FD_CLOEXEC,然后添加F_SETFD)。不要忘记您从accept 获得的套接字。

如果无法做到这一点,您可以在调用 exec 之前使用以下内容粗暴地关闭所有文件描述符:

n = sysconf(_SC_OPEN_MAX);
for(i = 3; i < n; i++)
    close(i);

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多