我希望能够干净地重启进程。因此,我尝试调用execv()
。
看起来它运行良好。但是,它仍然保持着套接字和文件的打开状态。 有没有一种方法可以重新启动该进程并关闭所有文件/套接字?
我不想创建僵尸进程,也不使用fork()
。
exec
或fork
时不会被关闭。如果您想要关闭它们,您需要自己关闭它们。有三种可能的方法。exec
之前跟踪所有套接字并将其关闭。根据您的应用程序,这可能是可能或不可能的。fcntl
调用(F_GETFD
,添加FD_CLOEXEC
,然后F_SETFD
)设置套接字的“执行时关闭”标志。不要忘记从accept
获取的套接字。exec
之前强制关闭所有文件描述符,例如:n = sysconf(_SC_OPEN_MAX);
for(i = 3; i < n; i++)
close(i);
close-on-exec
标志设置在所有您想要关闭的描述符上。 https://dev59.com/cG025IYBdhLWcg3wPzfL - Barmar