C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 在Qt中启动一个独立的过程并处理端口大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我可能对Qt的startDetached()如何工作有误解,但我正在目睹一个问题,我有一个作为远程启动器的应用程序.

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

问题在于当我杀死启动程序进程时,我无法重新启动它,因为@L_673_3@的进程似乎仍在使用启动程序尝试启动的端口.

我的问题是,我做错了什么?远程代理是否有更好的方法来启动不会将自身附加到端口的进程?

这是在Linux环境中.

编辑:Qt Bug我最终采用了这个错误修复,只是重新编译Qt.似乎工作!

解决方法

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

所以,如果你打开没有Qt的套接字,你应该做同样的事情.

编辑

你可以:

>尝试how to set close-on-exec by default中给出的循环,就在行/ *之下,请不要这样做* /,或
>如果您可以更改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;
}

大佬总结

以上是大佬教程为你收集整理的c – 在Qt中启动一个独立的过程并处理端口全部内容,希望文章能够帮你解决c – 在Qt中启动一个独立的过程并处理端口所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。