如何在C语言中关闭所有文件描述符并重启或启动一个进程

3

我希望能够干净地重启进程。因此,我尝试调用execv()

看起来它运行良好。但是,它仍然保持着套接字和文件的打开状态。 有没有一种方法可以重新启动该进程并关闭所有文件/套接字?

我不想创建僵尸进程,也不使用fork()


close-on-exec 标志设置在所有您想要关闭的描述符上。 https://dev59.com/cG025IYBdhLWcg3wPzfL - Barmar
1个回答

7
与其他文件描述符一样,套接字在execfork时不会被关闭。如果您想要关闭它们,您需要自己关闭它们。有三种可能的方法。
最干净的解决方案是在调用exec之前跟踪所有套接字并将其关闭。根据您的应用程序,这可能是可能或不可能的。
另一个解决方案是在创建套接字后立即使用一对fcntl调用(F_GETFD,添加FD_CLOEXEC,然后F_SETFD)设置套接字的“执行时关闭”标志。不要忘记从accept获取的套接字。
如果无法完成上述操作,则可以在调用exec之前强制关闭所有文件描述符,例如:
n = sysconf(_SC_OPEN_MAX);
for(i = 3; i < n; i++)
    close(i);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接