我想彻底重启我的流程。所以我试着打电话给execv()
。
它似乎运作良好。但是,它会保持套接字和文件的打开。 有没有办法重启(这个)进程并关闭所有文件/套接字?
我不想制作僵尸程序,我不会使用fork()
。
答案 0 :(得分:4)
与任何其他文件描述符一样,套接字不会在exec
或fork
之间关闭。如果您希望它们关闭,您需要自己关闭它们。有三种可能的方法。
最干净的解决方案是在调用exec
之前跟踪所有套接字并关闭它们。根据您的应用程序,这可能会也可能不会。
另一个解决方案是设置"关闭exec"在创建套接字后,使用一对fcntl
电话(F_GETFD
,添加FD_CLOEXEC
,然后F_SETFD
)来标记套接字。不要忘记从accept
获得的插座。
如果无法做到这一点,您可以在使用以下内容调用exec
之前粗暴地关闭所有文件描述符:
n = sysconf(_SC_OPEN_MAX);
for(i = 3; i < n; i++)
close(i);