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. How to close the subroutine of the program started by qprocess?

How to close the subroutine of the program started by qprocess?

Scheduled Pinned Locked Moved Solved General and Desktop
22 Posts 6 Posters 6.7k Views 1 Watching
  • 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 Offline
    J Offline
    jiaming
    wrote on last edited by
    #1

    I started A with qprocess, then A started B.
    When I use process.close (), only A is turned off and B is still running.
    B how to turn it off at the same time?

    JonBJ 1 Reply Last reply
    0
    • J jiaming

      I started A with qprocess, then A started B.
      When I use process.close (), only A is turned off and B is still running.
      B how to turn it off at the same time?

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #2

      @jiaming
      You can't. Your Qt app can only do something to the A sub-process it started, not some B sub-process which A starts. Hopefully when A terminates B will terminate too, but you have no control over that. I assume you're using QProcess::start() and not QProcess::startDetached(), FWIW.

      1 Reply Last reply
      0
      • J Offline
        J Offline
        jiaming
        wrote on last edited by
        #3

        I use QProcess::start()
        My program needs to open multiple A's, sometimes close A's, and then open A's, and so on.
        If B cannot be shut down, system resources will be exhausted.

        JonBJ 1 Reply Last reply
        0
        • Christian EhrlicherC Online
          Christian EhrlicherC Online
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Then fix A so it properly shuts down B

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          1 Reply Last reply
          1
          • J jiaming

            I use QProcess::start()
            My program needs to open multiple A's, sometimes close A's, and then open A's, and so on.
            If B cannot be shut down, system resources will be exhausted.

            JonBJ Offline
            JonBJ Offline
            JonB
            wrote on last edited by JonB
            #5

            @jiaming
            As @Christian-Ehrlicher has said. And as I said earlier, what else would you like us to say? Just because you would like A to shut down B does not mean Qt app has any control over this, or that we can wave magic wand to make it so it does....

            1 Reply Last reply
            1
            • JoeCFDJ Offline
              JoeCFDJ Offline
              JoeCFD
              wrote on last edited by JoeCFD
              #6

              Try this
              kill( m_process->pid(), SIGINT );
              before m_process is closed.

              or
              QString cmd = QString( "kill -9 %1" ).arg( m_process->pid() );
              call this
              exec( cmd.toStdString().c_str() );

              std::string exec(const char* cmd) {
              std::array<char, 128> buffer;
              std::string result;
              std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd, "r"), pclose);
              if (!pipe) {
              throw std::runtime_error("popen() failed!");
              }
              while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
              result += buffer.data();
              }
              return result;
              }
              from https://stackoverflow.com/questions/478898/how-do-i-execute-a-command-and-get-the-output-of-the-command-within-c-using-po

              J Christian EhrlicherC 2 Replies Last reply
              0
              • JoeCFDJ JoeCFD

                Try this
                kill( m_process->pid(), SIGINT );
                before m_process is closed.

                or
                QString cmd = QString( "kill -9 %1" ).arg( m_process->pid() );
                call this
                exec( cmd.toStdString().c_str() );

                std::string exec(const char* cmd) {
                std::array<char, 128> buffer;
                std::string result;
                std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd, "r"), pclose);
                if (!pipe) {
                throw std::runtime_error("popen() failed!");
                }
                while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
                result += buffer.data();
                }
                return result;
                }
                from https://stackoverflow.com/questions/478898/how-do-i-execute-a-command-and-get-the-output-of-the-command-within-c-using-po

                J Offline
                J Offline
                jiaming
                wrote on last edited by
                #7

                @JoeCFD
                No kill function found. Do you need to import any files?

                1 Reply Last reply
                0
                • JoeCFDJ JoeCFD

                  Try this
                  kill( m_process->pid(), SIGINT );
                  before m_process is closed.

                  or
                  QString cmd = QString( "kill -9 %1" ).arg( m_process->pid() );
                  call this
                  exec( cmd.toStdString().c_str() );

                  std::string exec(const char* cmd) {
                  std::array<char, 128> buffer;
                  std::string result;
                  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd, "r"), pclose);
                  if (!pipe) {
                  throw std::runtime_error("popen() failed!");
                  }
                  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
                  result += buffer.data();
                  }
                  return result;
                  }
                  from https://stackoverflow.com/questions/478898/how-do-i-execute-a-command-and-get-the-output-of-the-command-within-c-using-po

                  Christian EhrlicherC Online
                  Christian EhrlicherC Online
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @JoeCFD How should this help killing a sub-sub-process? Apart from this the OP is on windows...

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  1 Reply Last reply
                  1
                  • J Offline
                    J Offline
                    jiaming
                    wrote on last edited by
                    #9

                    My program runs on Ubuntu

                    JonBJ 1 Reply Last reply
                    0
                    • Christian EhrlicherC Online
                      Christian EhrlicherC Online
                      Christian Ehrlicher
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      Then 'kill' should be available. But it still does not solve your problem. Fix your 'A' program to properly shut down it's spawned processes.

                      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                      Visit the Qt Academy at https://academy.qt.io/catalog

                      1 Reply Last reply
                      2
                      • J jiaming

                        My program runs on Ubuntu

                        JonBJ Offline
                        JonBJ Offline
                        JonB
                        wrote on last edited by JonB
                        #11

                        @jiaming

                        My program runs on Ubuntu

                        And so? As I & @Christian-Ehrlicher have said, you cannot use this to kill a "sub-sub-process". You don't know the PID of the process you want to kill.

                        Can you please take the time to address what @Christian-Ehrlicher wrote earlier:

                        Then fix A so it properly shuts down B

                        [Under Linux you could try using pkill to kill all B processes, but I really wouldn't recommend it....]

                        1 Reply Last reply
                        0
                        • J Offline
                          J Offline
                          jiaming
                          wrote on last edited by
                          #12

                          I forgot to say that if A is opened in a terminal, B will also be closed when using Ctrl+C to close. What I am looking for is a method similar to sending a Ctrl+C signal.

                          JonBJ JoeCFDJ 2 Replies Last reply
                          0
                          • J jiaming

                            I forgot to say that if A is opened in a terminal, B will also be closed when using Ctrl+C to close. What I am looking for is a method similar to sending a Ctrl+C signal.

                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by JonB
                            #13

                            @jiaming
                            Use Linux man 2 kill call: kill(pid_of_A, SIGINT). But I doubt it will work from here.

                            It's nice to see that you ignore every suggestion we make.... Best of luck.

                            1 Reply Last reply
                            0
                            • J Offline
                              J Offline
                              jiaming
                              wrote on last edited by
                              #14

                              The main reason is that I didn't write A and B programs. They have formed a good system. It's troublesome for me to change them. It's better to have a simpler method.

                              I found that PPID of B is 1......

                              I'm sorry for the trouble.

                              jsulmJ JonBJ 3 Replies Last reply
                              0
                              • J jiaming

                                The main reason is that I didn't write A and B programs. They have formed a good system. It's troublesome for me to change them. It's better to have a simpler method.

                                I found that PPID of B is 1......

                                I'm sorry for the trouble.

                                jsulmJ Offline
                                jsulmJ Offline
                                jsulm
                                Lifetime Qt Champion
                                wrote on last edited by
                                #15

                                @jiaming said in How to close the subroutine of the program started by qprocess?:

                                I found that PPID of B is 1

                                You need PID if you want to kill it...

                                https://forum.qt.io/topic/113070/qt-code-of-conduct

                                1 Reply Last reply
                                0
                                • J jiaming

                                  The main reason is that I didn't write A and B programs. They have formed a good system. It's troublesome for me to change them. It's better to have a simpler method.

                                  I found that PPID of B is 1......

                                  I'm sorry for the trouble.

                                  jsulmJ Offline
                                  jsulmJ Offline
                                  jsulm
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #16

                                  @jiaming You could try to get PID from B using PID from A, see https://stackoverflow.com/questions/17743879/how-to-get-child-process-from-parent-process

                                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  1 Reply Last reply
                                  0
                                  • J jiaming

                                    The main reason is that I didn't write A and B programs. They have formed a good system. It's troublesome for me to change them. It's better to have a simpler method.

                                    I found that PPID of B is 1......

                                    I'm sorry for the trouble.

                                    JonBJ Offline
                                    JonBJ Offline
                                    JonB
                                    wrote on last edited by JonB
                                    #17

                                    @jiaming said in How to close the subroutine of the program started by qprocess?:

                                    I found that PPID of B is 1......

                                    Which is why I said I do not think that sending a SIGINT to the parent (A) will have any effect on B...!

                                    A process ID value of 1 indicates that there is no parent process associated with the [...] process."

                                    1 Reply Last reply
                                    1
                                    • J jiaming

                                      I forgot to say that if A is opened in a terminal, B will also be closed when using Ctrl+C to close. What I am looking for is a method similar to sending a Ctrl+C signal.

                                      JoeCFDJ Offline
                                      JoeCFDJ Offline
                                      JoeCFD
                                      wrote on last edited by JoeCFD
                                      #18

                                      @jiaming kill( m_process->pid(), SIGINT ); <==this does what you need. You need somehow to find the pid of B.
                                      std::string pid_str = exec( "pidof B" ); exec is defined in the post above and "pidof" is a linux command to find process id.
                                      if( !pid_str.empty() ) {
                                      int pid = std::stoi( pid_str );
                                      kill( pid, SIGINT );
                                      }

                                      JonBJ 1 Reply Last reply
                                      0
                                      • JoeCFDJ JoeCFD

                                        @jiaming kill( m_process->pid(), SIGINT ); <==this does what you need. You need somehow to find the pid of B.
                                        std::string pid_str = exec( "pidof B" ); exec is defined in the post above and "pidof" is a linux command to find process id.
                                        if( !pid_str.empty() ) {
                                        int pid = std::stoi( pid_str );
                                        kill( pid, SIGINT );
                                        }

                                        JonBJ Offline
                                        JonBJ Offline
                                        JonB
                                        wrote on last edited by
                                        #19

                                        @JoeCFD said in How to close the subroutine of the program started by qprocess?:

                                        You need somehow to find the pid of B.

                                        But he doesn't know the PID of B.

                                        1 Reply Last reply
                                        0
                                        • JoeCFDJ Offline
                                          JoeCFDJ Offline
                                          JoeCFD
                                          wrote on last edited by
                                          #20

                                          Be aware that Control + C ( kill( pid, SIGINT ); ) may not kill your process all the time.
                                          exec( "kill -9 pid" ) will be very clean.

                                          1 Reply Last reply
                                          0

                                          • Login

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