Congratulations to our 2022 Qt Champions!

Disconnect between forked process and client

  • Hi all,

    I have QCoreApplication server running on Linux, server fork itself when new connection is made from client
    void Ccbox::incomingConnection(qintptr handle) {
    pid_t PID=fork();
    if(PID==0) {
    } else {
    qDebug()<<"Ccbox::incomingConnection another process started";

    "this->close()" is to close child process to listen to port like parent, then pointer "handle" is passed to function that creates socket

    socket=new QSslSocket(this);
    if(!socket->setSocketDescriptor(socketDescriptor)) {
    qDebug() <<"setSocketError:"<<socket->error();
    qDebug()<<"ssl supported:"<<socket->supportsSsl();

    this is QSslSocket so some cert options are set and connection is encrypted.

    The problem is that my forked server always ends up in defunct state "[ccbox-demo] <defunct>" after connection is closed between server and client and server makes qApp->quit();

    Connection close is initiated by client with disconnectFromHost and on both ends I can see socket is entering state: QAbstractSocket::UnconnectedState, 5 seconds later forked server makes qApp->quit() and ends up in defunct state.
    I think is what I don't understand is this:
    When I check with lsof command, right after I start client and fork server it shows that both parent and child server are connected to the client:
    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)

    and after client is closed parent server is still connected to the client waiting in CLOSE_WAIT state

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

    What should I do in parent server to close this connection right after child server has started ? Or is this some other problem? I need to get rid of these defunct processes

    Best Regards

  • Really, no one knows anything about it?


Log in to reply