c++ - 在 Qt 中启动一个分离进程并处理端口

标签 c++ linux qt networking

我可能对 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/

相关文章:

C++ 当模板参数推导失败时

c++ - Qt Q_PROPERTY 是否要求我的类继承 QObject?

node.js - Systemd Node 应用程序无法启动

c++ - 使用 Qt 的 QLabel 类更改呈现的 HTML 中的制表位大小

c++ - 如何在 VS 代码中为 Bazel 项目启用 C++ 智能感知?

c++ - 模板实例化对编译持续时间的影响

c - 最后一个 fork 的 child 不会死

php - Linux Apache2 PHP 5.3 日志文件的正确权限是什么?

QTextEdit设置固定行高、段落间距

c++ - Qt 更改主窗口几何形状