我可能对 Qt 的 startDetached()
的工作原理有误解,但我目睹了一个问题,我有一个用作远程启动器的应用程序。
启动器使用 startDetached
生成进程,我认为这将启动器应用程序与新进程完全分开。然而,发射器使用的端口发生了一些可疑的事情。生成的进程似乎也在监听这些相同的端口,尽管事实上它们不使用任何网络代码。
问题在于当我终止启动器进程时,我无法重新启动它,因为生成的进程似乎仍在使用启动器试图启动的端口。
我的问题是,我做错了什么?有没有更好的方法让远程代理启动不将自身附加到端口的进程?
这是在 Linux 环境中。
编辑:Qt Bug我最终采用了该错误修复并重新编译了 Qt。似乎有效!
最佳答案
根据 that bug report , Qt (QFile, QTcpSocket...) 打开的所有文件和套接字描述符都标有 FD_CLOEXEC
以防止它们与子进程共享。
因此,如果您在没有 Qt 的情况下打开套接字,您可能应该这样做。
编辑
I am opening sockets with the ICE framework.
你可以:
- 尝试how to set close-on-exec by default中给出的循环,就在
/* please don't do this */
行下方,或者 - 将同一链接的第一行插入
Ice/cpp/src/Ice/Network.cpp
的函数createSocket
中,如果您可以更改 ICE 源代码 (并重新分发您的更改(如果您使用他们的 GPL 许可证),或者 使用类似 daemonize 的包装进程在运行之前关闭所有描述符 真正的子进程。
也许像下面的代码这样更简单的东西也可以工作(它编译和运行良好,但我没有用打开的套接字测试它):#include <unistd.h> #include <iostream> #include <cstring> #include <cerrno> int main(int argc, char**argv) { // close all descriptors except stdout/stdin/stderr int maxfd = sysconf(_SC_OPEN_MAX); for(int fd = 3; fd < maxfd; fd++) close(fd); // pass all the program arguments except the wrapper name execve(argv[1], &argv[1], environ); // exec() only returns if an error occurred std::cerr << strerror(errno) << std::endl; return 1; }
关于c++ - 在 Qt 中启动一个分离进程并处理端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7390082/