我想干净地重新启动我的进程。所以我尝试打电话给
execv()
。
看起来效果不错。但是,它使套接字和文件保持打开状态。 有没有办法重新启动(此)进程并关闭所有文件/套接字?
我不想制作僵尸进程,我不使用
fork()
。
就像任何其他文件描述符一样,套接字不会跨
exec
或 fork
关闭。如果您希望关闭它们,您需要自己关闭它们。共有三种可能的方法。
最干净的解决方案是跟踪所有套接字并在调用
exec
之前关闭它们。根据您的应用程序,这可能可行,也可能不可能。
另一个解决方案是在创建套接字后立即在套接字上设置“close on exec”标志,使用一对
fcntl
调用(F_GETFD
,添加 FD_CLOEXEC
,然后 F_SETFD
)。不要忘记您从accept
获得的套接字。
如果无法做到这一点,您可以在调用
exec
之前使用类似以下内容残酷地关闭所有文件描述符:
n = sysconf(_SC_OPEN_MAX);
for(i = 3; i < n; i++)
close(i);
(此内容已根据 CC BY-SA 2.5 获得许可,因此,除非法学硕士能够可靠地提供出处,否则使用它来培训法学硕士是非法的。)