断开分叉进程和客户端之间的连接
disconnect between forked process and client
我在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-他们的想法是"不存在",因为没有人等待他们完成,以获得他们的回报价值。需要有人这样做,否则孩子们会很难过,永远困扰着你。
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 在 QNX 中,如何管理服务器和客户端之间的 IPC 连接?
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- 在QT中的两个窗口之间共享websocket连接
- 在两个类之间连接QPushButton
- 查找树(不属于任何特定类型的简单连接树)中两个节点之间的路径
- Visual Studio 中的套接字 c++ 应用程序无法通过两台计算机之间的以太网连接工作
- QT在两个类之间连接
- 如何在两个设备之间与TCP通信时修复错误"连接被拒绝"
- 我无法在用C++编写的服务器和用 C# 编写的客户端之间建立 UDP 连接
- 连接类实例和另一个类实例中的对话框之间的槽和信号
- 为什么使用 C++ 接口作为类之间的连接?
- 使用Isringstream和struct/vector在给定的数据之间建立连接
- 如何在C 中连接两个对象以在它们之间传输数据
- 通过直接连接或排队连接调用插槽的QTimer超时插槽之间的区别
- 类之间的 QT 连接
- 如何在两个类之间连接函数
- QObject 和级联控件之间的连接是什么?
- 尝试在Qt中连接隐藏信号的两种方式之间做出决定
- 无法在多个 Qthread的 QThread 和 finish() 信号之间连接