如何通过关闭 C 中的所有文件描述符来重新启动或启动进程
How to restart or start a process with closing all file descriptors in C
我想干净地重新启动我的进程。所以我试着打电话给 execv()
.
看起来效果不错。但是,它使套接字和文件保持打开状态。
有没有办法重新启动(这个)进程并关闭所有 file/sockets?
我不想做僵尸进程,我不用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);
我想干净地重新启动我的进程。所以我试着打电话给 execv()
.
看起来效果不错。但是,它使套接字和文件保持打开状态。 有没有办法重新启动(这个)进程并关闭所有 file/sockets?
我不想做僵尸进程,我不用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);