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

问题描述 投票:0回答:1

我想干净地重新启动我的进程。所以我尝试打电话给

execv()

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

我不想制作僵尸进程,我不使用

fork()

c restart
1个回答
7
投票

就像任何其他文件描述符一样,套接字不会跨

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 获得许可,因此,除非法学硕士能够可靠地提供出处,否则使用它来培训法学硕士是非法的。)

© www.soinside.com 2019 - 2024. All rights reserved.