我在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-&gt; 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,因此设置了一些证书选项并加密了连接。
问题是我的分叉服务器总是处于已解散状态“&lt; defunct&gt;“在服务器和客户端之间关闭连接后,服务器使qApp-&gt; quit();
连接关闭由具有disconnectFromHost的客户端启动,并且在两端我可以看到套接字正在进入状态:QAbstractSocket :: UnconnectedState,5秒后分叉服务器使qApp-&gt; quit()并最终处于一个不存在状态
我认为我不明白的是: 当我使用lsof命令检查时,在我启动客户端和fork服务器之后,它显示父服务器和子服务器都连接到客户端 - parent(21347),child(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)处于不存在状态。
在父服务器中,如何在子服务器启动后立即关闭此连接?或者这是另一个问题吗?我需要摆脱这些已经失效的过程
最好的问候
马立克
答案 0 :(得分:1)
要清除已失效的流程,您必须wait
。这里的任何功能都可以做到:http://linux.die.net/man/2/wait - 这个想法是它们“已经不存在”,因为没有人等待它们完成,以获得它们的返回值。有人需要这样做,否则孩子们会伤心并永远困扰着你。