断开分叉进程和客户端之间的连接

disconnect between forked process and client

本文关键字:之间 连接 客户端 分叉 进程 断开      更新时间:2023-10-16

我在Linux上使用Qt 5.3。我有运行在Linux上的QCoreApplication服务器,当新连接从客户端到达时,服务器会自行分叉。

void Ccbox::incomingConnection(qintptr handle) {
    qDebug()<<"Ccbox::incomingConnection";
    pid_t PID=fork();
    if(PID==0) {
       this->close();
       this->startNetwork(handle);
    } else {
        qDebug()<<"Ccbox::incomingConnection another process started";
    }
}

"this->close()"是关闭子进程以像父进程一样侦听端口,然后指针"handle"被传递给创建套接字的函数

socket=new QSslSocket(this);
if(!socket->setSocketDescriptor(socketDescriptor)) {
        qDebug() <<"setSocketError:"<<socket->error();
        return;
    }
qDebug()<<"ssl supported:"<<socket->supportsSsl();
qDebug()<<"peerAddress:"<<socket->peerAddress();
socket->addCaCertificates(Zm().sslCA+Zm().sslCACert);
socket->setPrivateKey(Zm().sslFiles+Zm().sslKey);
socket->setLocalCertificate(Zm().sslFiles+Zm().sslCert);
socket->setPeerVerifyMode(QSslSocket::VerifyPeer);
socket->startServerEncryption();

这是QSslSocket,所以设置了一些证书选项,并对连接进行了加密。

问题是,在服务器和客户端之间的连接关闭后,我的分叉服务器总是处于失效状态"<defunct>",并且服务器使qApp->quit();

连接关闭是由一个具有disconnectFromHost的客户端启动的,在两端我可以看到套接字正在进入状态:QAbstractSocket::UnconnectedState,5秒后,分叉服务器使qApp->quit(),并最终处于无效状态。

我想我不明白的是:当我使用lsof命令进行检查时,在我启动客户端和分叉服务器之后,它显示父服务器和子服务器都连接到客户端-父服务器(21347),子服务器(21351):

ccbox-dem 21347   7u  IPv4 2439080      0t0  TCP *:4321 (LISTEN)
ccbox-dem 21347   8u  IPv4 2442399      0t0  TCP localhost:4321->localhost:38669 (ESTABLISHED)
ccbox-big 21349     10u  IPv4 2440519      0t0  TCP localhost:38669->localhost:4321 (ESTABLISHED)
ccbox-dem 21351   8u  IPv4 2442399      0t0  TCP localhost:4321->localhost:38669 (ESTABLISHED)

并且在客户端关闭之后,父服务器仍然连接到处于CLOSE_WAIT状态等待的客户端

ccbox-dem 21347    7u  IPv4 2439080      0t0  TCP *:4321 (LISTEN)
ccbox-dem 21347    8u  IPv4 2442399      0t0  TCP localhost:4321->localhost:38669 (CLOSE_WAIT)

并且"ps-ax"命令显示子进程(21351)处于无效状态。

在子服务器启动后,我应该在父服务器中做些什么来关闭此连接?或者这是其他问题?我需要摆脱这些失效的过程

致以最诚挚的问候

Marek

要清理不起作用的进程,必须为它们设置wait。这里的任何功能都可以:http://linux.die.net/man/2/wait-他们的想法是"不存在",因为没有人等待他们完成,以获得他们的回报价值。需要有人这样做,否则孩子们会很难过,永远困扰着你。