Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QProcess and Ctrl-Z + BG on Linux
Forum Update on Monday, May 27th 2025

QProcess and Ctrl-Z + BG on Linux

Scheduled Pinned Locked Moved Unsolved General and Desktop
qprocess
17 Posts 5 Posters 5.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J JonB
    15 Jun 2023, 08:45

    @Sameer , @jsulm , @kkoehne
    To make up for my earlier misunderstanding, have tried following standalone code:

    #include <QApplication>
    #include <QDebug>
    #include <QLayout>
    #include <QObject>
    #include <QProcess>
    #include <QPushButton>
    #include <QWidget>
    
    class MyWidget : public QWidget
    {
    private:
        QProcess *proc;
    
    public slots:
        void onClicked()
        {
            proc = new QProcess;
            QObject::connect(proc, &QProcess::started, this, []() { qDebug() << "Process started"; } );
            QObject::connect(proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, []() { qDebug() << "Process finished"; } );
            proc->start("sleep", { "10"} );
        }
    };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MyWidget w;
        w.setLayout(new QVBoxLayout);
        QPushButton *pb = new QPushButton("QProcess");
        w.layout()->addWidget(pb);
        w.show();
    
        QObject::connect(pb, &QPushButton::clicked, &w, &MyWidget::onClicked);
    
        return a.exec();
    }
    

    Qt 5.15 (I don't have Qt6), Ubuntu 22.04. Run from terminal. Press Ctrl+Z there after launching, then bg. Then press the button. I do see in the terminal from the debug output Process started followed by Process finished 10 seconds later. So it works normally.

    Suggest you first try this, does it work for you? If it does compare against your code to find a difference.

    S Offline
    S Offline
    SameerK
    wrote on 19 Jul 2023, 06:02 last edited by SameerK
    #8

    @JonB
    I tried your simple example and it works as expected. I see both the started and finished slots being called even after suspending the application with ctrl+Z and putting it in background.

    However same thing doesn't seem to happen in my code. Unfortunately my code is too complex to put here. But I tried the following experiment.

    Where I start my process, I also started a test process similar to your example.

    m_testProcess = new QProcess;
    QObject::connect(m_testProcess, &QProcess::started, this, []() { qDebug() << "m_testProcess started"; } );
    QObject::connect(m_testProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, []() { qDebug() << "m_testProcess finished"; } );
    m_testProcess->start("sleep", { "1"} );
    

    Before Ctrl-Z + bg, I see both started and finished messages.
    After Ctrl-Z + bg, I see the started message but not the finished message.

    Any idea what might be going on?

    J 1 Reply Last reply 19 Jul 2023, 08:54
    0
    • S SameerK
      19 Jul 2023, 06:02

      @JonB
      I tried your simple example and it works as expected. I see both the started and finished slots being called even after suspending the application with ctrl+Z and putting it in background.

      However same thing doesn't seem to happen in my code. Unfortunately my code is too complex to put here. But I tried the following experiment.

      Where I start my process, I also started a test process similar to your example.

      m_testProcess = new QProcess;
      QObject::connect(m_testProcess, &QProcess::started, this, []() { qDebug() << "m_testProcess started"; } );
      QObject::connect(m_testProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, []() { qDebug() << "m_testProcess finished"; } );
      m_testProcess->start("sleep", { "1"} );
      

      Before Ctrl-Z + bg, I see both started and finished messages.
      After Ctrl-Z + bg, I see the started message but not the finished message.

      Any idea what might be going on?

      J Offline
      J Offline
      JonB
      wrote on 19 Jul 2023, 08:54 last edited by
      #9

      @SameerK said in QProcess and Ctrl-Z + BG on Linux:

      However same thing doesn't seem to happen in my code. Unfortunately my code is too complex to put here.

      I think you know the likely response here! If code works in simple case but not in your "complex" case then probably nobody can guess. You really need to comment out swathes of code till you can find where the different behaviour seems to emanate from.

      A couple of tests here. I don't know what we will make of the answers, but let's gather the information:

      • Where you do your test you say you do this sleep() as well as your process. Eliminate your process for a while, just in case that somehow interferes.
      • Instead of going bg after the Ctrl+Z try fg instead. Any difference?
      • When you do not get the QProcess::finished signal, use ps to find the current state of the sub-process. Is it running? Suspended? Zombied? Removed from running processes and no longer found?
      • Attach slot to signal void QProcess::stateChanged(QProcess::ProcessState newState). What state changes do you get?
      • When setting off sub-process start a QTimer for, say, once per second. Have it report QProcess::ProcessState QProcess::state() const. What state does that repeatedly report?
      S 2 Replies Last reply 19 Jul 2023, 17:44
      1
      • J JonB
        19 Jul 2023, 08:54

        @SameerK said in QProcess and Ctrl-Z + BG on Linux:

        However same thing doesn't seem to happen in my code. Unfortunately my code is too complex to put here.

        I think you know the likely response here! If code works in simple case but not in your "complex" case then probably nobody can guess. You really need to comment out swathes of code till you can find where the different behaviour seems to emanate from.

        A couple of tests here. I don't know what we will make of the answers, but let's gather the information:

        • Where you do your test you say you do this sleep() as well as your process. Eliminate your process for a while, just in case that somehow interferes.
        • Instead of going bg after the Ctrl+Z try fg instead. Any difference?
        • When you do not get the QProcess::finished signal, use ps to find the current state of the sub-process. Is it running? Suspended? Zombied? Removed from running processes and no longer found?
        • Attach slot to signal void QProcess::stateChanged(QProcess::ProcessState newState). What state changes do you get?
        • When setting off sub-process start a QTimer for, say, once per second. Have it report QProcess::ProcessState QProcess::state() const. What state does that repeatedly report?
        S Offline
        S Offline
        SameerK
        wrote on 19 Jul 2023, 17:44 last edited by
        #10

        @JonB Will try out your sugeestions.

        Just wanna say that I really appreciate you responding to this "help me find a needle in the haystack" kind of question :)

        1 Reply Last reply
        0
        • J JonB
          19 Jul 2023, 08:54

          @SameerK said in QProcess and Ctrl-Z + BG on Linux:

          However same thing doesn't seem to happen in my code. Unfortunately my code is too complex to put here.

          I think you know the likely response here! If code works in simple case but not in your "complex" case then probably nobody can guess. You really need to comment out swathes of code till you can find where the different behaviour seems to emanate from.

          A couple of tests here. I don't know what we will make of the answers, but let's gather the information:

          • Where you do your test you say you do this sleep() as well as your process. Eliminate your process for a while, just in case that somehow interferes.
          • Instead of going bg after the Ctrl+Z try fg instead. Any difference?
          • When you do not get the QProcess::finished signal, use ps to find the current state of the sub-process. Is it running? Suspended? Zombied? Removed from running processes and no longer found?
          • Attach slot to signal void QProcess::stateChanged(QProcess::ProcessState newState). What state changes do you get?
          • When setting off sub-process start a QTimer for, say, once per second. Have it report QProcess::ProcessState QProcess::state() const. What state does that repeatedly report?
          S Offline
          S Offline
          SameerK
          wrote on 19 Jul 2023, 18:19 last edited by
          #11

          @JonB said in QProcess and Ctrl-Z + BG on Linux:

          These were very useful suggestions.

          • Where you do your test you say you do this sleep() as well as your process. Eliminate your process for a while, just in case that somehow interferes.
            Did this. Still the same result.
          • Instead of going bg after the Ctrl+Z try fg instead. Any difference?
            Doing fg instead bg produces same result.
          • When you do not get the QProcess::finished signal, use ps to find the current state of the sub-process. Is it running? Suspended? Zombied? Removed from running processes and no longer found?
            Shows up as follows withps - [sleep] <defunct>
          • Attach slot to signal void QProcess::stateChanged(QProcess::ProcessState newState). What state changes do you get?
            I get Starting and Running, nothing afterwards.
            Debug: m_runProcess stateChanged - QProcess::Starting
            Debug: m_runProcess stateChanged - QProcess::Running
            Debug: m_runProcess started
          • When setting off sub-process start a QTimer for, say, once per second. Have it report QProcess::ProcessState QProcess::state() const. What state does that repeatedly report?
            Tried this. It reports the process as "Running"
          J 1 Reply Last reply 19 Jul 2023, 20:06
          1
          • S SameerK
            19 Jul 2023, 18:19

            @JonB said in QProcess and Ctrl-Z + BG on Linux:

            These were very useful suggestions.

            • Where you do your test you say you do this sleep() as well as your process. Eliminate your process for a while, just in case that somehow interferes.
              Did this. Still the same result.
            • Instead of going bg after the Ctrl+Z try fg instead. Any difference?
              Doing fg instead bg produces same result.
            • When you do not get the QProcess::finished signal, use ps to find the current state of the sub-process. Is it running? Suspended? Zombied? Removed from running processes and no longer found?
              Shows up as follows withps - [sleep] <defunct>
            • Attach slot to signal void QProcess::stateChanged(QProcess::ProcessState newState). What state changes do you get?
              I get Starting and Running, nothing afterwards.
              Debug: m_runProcess stateChanged - QProcess::Starting
              Debug: m_runProcess stateChanged - QProcess::Running
              Debug: m_runProcess started
            • When setting off sub-process start a QTimer for, say, once per second. Have it report QProcess::ProcessState QProcess::state() const. What state does that repeatedly report?
              Tried this. It reports the process as "Running"
            J Offline
            J Offline
            JonB
            wrote on 19 Jul 2023, 20:06 last edited by
            #12

            @SameerK said in QProcess and Ctrl-Z + BG on Linux:

            Shows up as follows withps - [sleep] <defunct>

            Not sure. From what you say I think the sleep sub-process has exited but not been waited on by its parent. Qt parent still thinks process is running, hence no finished.

            Really I'm afraid as you know we have demonstrated in a small test program that it behaves OK there. I think you will have to find out what differs in your real program.

            S 1 Reply Last reply 19 Jul 2023, 21:41
            0
            • J JonB
              19 Jul 2023, 20:06

              @SameerK said in QProcess and Ctrl-Z + BG on Linux:

              Shows up as follows withps - [sleep] <defunct>

              Not sure. From what you say I think the sleep sub-process has exited but not been waited on by its parent. Qt parent still thinks process is running, hence no finished.

              Really I'm afraid as you know we have demonstrated in a small test program that it behaves OK there. I think you will have to find out what differs in your real program.

              S Offline
              S Offline
              SameerK
              wrote on 19 Jul 2023, 21:41 last edited by SameerK
              #13

              @JonB

              Yes that's what seems to be happening.

              Another thing I discovered. This happens only with an explicit Ctrl+Z.
              If I send a SIGSTOP to the main application process from another terminal and then put it into background, things are fine.

              J 1 Reply Last reply 20 Jul 2023, 07:06
              0
              • S SameerK
                19 Jul 2023, 21:41

                @JonB

                Yes that's what seems to be happening.

                Another thing I discovered. This happens only with an explicit Ctrl+Z.
                If I send a SIGSTOP to the main application process from another terminal and then put it into background, things are fine.

                J Offline
                J Offline
                JonB
                wrote on 20 Jul 2023, 07:06 last edited by
                #14

                @SameerK
                I had meant to mention testing that. That's ridiculous. But again I'm afraid I don't know what it tells us, nor what you can do about it. I reiterate that since it does not happen on my small test program you are going to have to find out what is different in your complex situation, somehow.

                S 2 Replies Last reply 20 Jul 2023, 15:19
                0
                • J JonB
                  20 Jul 2023, 07:06

                  @SameerK
                  I had meant to mention testing that. That's ridiculous. But again I'm afraid I don't know what it tells us, nor what you can do about it. I reiterate that since it does not happen on my small test program you are going to have to find out what is different in your complex situation, somehow.

                  S Offline
                  S Offline
                  SameerK
                  wrote on 20 Jul 2023, 15:19 last edited by
                  #15

                  @JonB Doing that now.

                  But once again wanna mention that I truly appreciate you spending time helping me debug this.

                  1 Reply Last reply
                  0
                  • J JonB
                    20 Jul 2023, 07:06

                    @SameerK
                    I had meant to mention testing that. That's ridiculous. But again I'm afraid I don't know what it tells us, nor what you can do about it. I reiterate that since it does not happen on my small test program you are going to have to find out what is different in your complex situation, somehow.

                    S Offline
                    S Offline
                    SameerK
                    wrote on 20 Jul 2023, 17:33 last edited by
                    #16

                    @JonB I went back to your small test program and ran another experiment and now I can get that to fail too!!!

                    Invoke test application
                    Ctrl-Z
                    bg
                    Press button
                    Things work fine (Get both started and finished signals)

                    Invoke test application
                    Press button
                    Things work fine (Get both started and finished signals)
                    Ctrl-Z
                    bg
                    Press button
                    Things don't work anymore (Get started signal but no finished signal!!!)

                    Btw, I am using Qt5.12 and on RedHat Enterprise Linux 8.6

                    J 1 Reply Last reply 20 Jul 2023, 17:39
                    0
                    • S SameerK
                      20 Jul 2023, 17:33

                      @JonB I went back to your small test program and ran another experiment and now I can get that to fail too!!!

                      Invoke test application
                      Ctrl-Z
                      bg
                      Press button
                      Things work fine (Get both started and finished signals)

                      Invoke test application
                      Press button
                      Things work fine (Get both started and finished signals)
                      Ctrl-Z
                      bg
                      Press button
                      Things don't work anymore (Get started signal but no finished signal!!!)

                      Btw, I am using Qt5.12 and on RedHat Enterprise Linux 8.6

                      J Offline
                      J Offline
                      JonB
                      wrote on 20 Jul 2023, 17:39 last edited by
                      #17

                      @SameerK
                      If it's repeatable you can raise a bug report for it. They will want as small a piece of code for the UI as possible. Pick something standard under Linux for the command (sleep might be suitable).

                      1 Reply Last reply
                      0

                      17/17

                      20 Jul 2023, 17:39

                      • Login

                      • Login or register to search.
                      17 out of 17
                      • First post
                        17/17
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved