【问题标题】:Starting a detached proceess in Qt and dealing with ports在 Qt 中启动分离进程并处理端口
【发布时间】:2011-09-12 15:12:55
【问题描述】:

我可能对 Qt 的 startDetached() 的工作原理存在误解,但我看到了一个问题,即我有一个用作远程启动器的应用程序。

启动器使用startDetached 生成进程,我认为它将启动器应用程序与新进程完全分开。但是,启动器使用的端口发生了一些可疑的事情。生成的进程似乎也在侦听这些相同的端口,尽管它们不使用任何网络代码。

问题在于当我终止启动器进程时,我无法重新启动它,因为生成的进程似乎仍在使用启动器试图启动的端口。

我的问题是,我做错了什么?有没有更好的方法让远程代理启动不附加到端口的进程?

这是在 Linux 环境中。

编辑:Qt Bug 我最终采用了该错误修复并重新编译了 Qt。似乎有效!

【问题讨论】:

    标签: c++ linux qt networking


    【解决方案1】:

    根据that bug report,Qt 打开的所有文件和套接字描述符(QFile、QTcpSocket...)都被标记为FD_CLOEXEC,以防止它们与子进程共享。

    因此,如果您在没有 Qt 的情况下打开套接字,您可能应该这样做。

    编辑

    我正在使用 ICE 框架打开套接字。

    你可以:

    • 尝试how to set close-on-exec by default 中给出的循环,就在/* please don't do this */ 行的下方,或者
    • 如果您可以更改 ICE 源代码(如果您使用他们的 GPL 许可证,则重新分发您的更改),从 Ice/cpp/src/Ice/Network.cpp 插入函数 createSocket 中相同链接的第一行,或者
    • 使用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;
      }
      

    【讨论】:

    • 这基本上是解决方案,但我采用了不同的方法。
    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多