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

sof*_*rko 1 c restart

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

看来运作良好。但是,它保持套接字和文件打开。有没有办法重新启动(此)过程并关闭所有文件/插槽?

我不想使用僵尸程序,我不使用fork()

jch*_*jch 5

与其他文件描述符一样,套接字也不会跨exec或封闭fork。如果要关闭它们,则需要自己关闭它们。有三种可能的方法。

最干净的解决方案是在调用之前跟踪所有套接字并关闭它们exec。根据您的应用程序,这可能会或可能不会。

另一种解决方案是在创建套接字后立即使用一对fcntl调用(F_GETFD,add FD_CLOEXEC,then F_SETFD)在套接字上设置“ close exec”标志。不要忘记您从获得的套接字accept

如果无法做到这一点,则可以在调用之前exec使用以下类似的方法残酷地关闭所有文件描述符:

n = sysconf(_SC_OPEN_MAX);
for(i = 3; i < n; i++)
    close(i);
Run Code Online (Sandbox Code Playgroud)