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

How to restart or start a process with closing all file descriptors in C

我想干净地重新启动我的进程。所以我试着打电话给 execv().

看起来效果不错。但是,它使套接字和文件保持打开状态。 有没有办法重新启动(这个)进程并关闭所有 file/sockets?

我不想做僵尸进程,我不用fork()

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

最干净的解决方案是跟踪所有套接字并在调用 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);