如何通过关闭C中的所有文件描述符来重新启动或启动进程

时间:2015-02-06 02:24:13

标签: c restart

我想彻底重启我的流程。所以我试着打电话给execv()

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

我不想制作僵尸程序,我不会使用fork()

1 个答案:

答案 0 :(得分:4)

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

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

另一个解决方案是设置"关闭exec"在创建套接字后,使用一对fcntl电话(F_GETFD,添加FD_CLOEXEC,然后F_SETFD)来标记套接字。不要忘记从accept获得的插座。

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

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