加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在Qt中启动一个独立的过程并处理端口

发布时间:2020-12-16 06:57:25 所属栏目:百科 来源:网络整理
导读:我可能对Qt的startDetached()如何工作有误解,但我正在目睹一个问题,我有一个作为远程启动器的应用程序. 启动器使用startDetached生成进程,我认为将启动器应用程序完全与新进程分开.然而,发射器使用的端口发生了一些可疑的事情.尽管它们不使用任何网络代码,但
我可能对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中给出的循环,就在行/ *之下,请不要这样做* /,或
>如果您可以更改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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读