【发布时间】:2015-02-06 02:24:12
【问题描述】:
我想干净地重新启动我的进程。所以我试着打电话给execv()。
它似乎运作良好。但是,它使套接字和文件保持打开状态。 有没有办法重新启动(这个)进程并关闭所有文件/套接字?
我不想做僵尸进程,我不使用fork()。
【问题讨论】:
-
在所有要关闭的描述符上设置
close-on-exec标志。 stackoverflow.com/questions/6125068/…
我想干净地重新启动我的进程。所以我试着打电话给execv()。
它似乎运作良好。但是,它使套接字和文件保持打开状态。 有没有办法重新启动(这个)进程并关闭所有文件/套接字?
我不想做僵尸进程,我不使用fork()。
【问题讨论】:
close-on-exec 标志。 stackoverflow.com/questions/6125068/…
就像任何其他文件描述符一样,exec 或 fork 之间的套接字不会关闭。如果您希望它们关闭,您需要自己关闭它们。有三种可能的方法。
最干净的解决方案是在调用exec 之前跟踪所有套接字并关闭它们。根据您的应用程序,这可能会也可能不会。
另一种解决方案是在创建套接字后立即在套接字上设置“执行时关闭”标志,使用一对fcntl 调用(F_GETFD,添加FD_CLOEXEC,然后添加F_SETFD)。不要忘记您从accept 获得的套接字。
如果无法做到这一点,您可以在调用 exec 之前使用以下内容粗暴地关闭所有文件描述符:
n = sysconf(_SC_OPEN_MAX);
for(i = 3; i < n; i++)
close(i);
【讨论】: