即使进程终止,waitpid也始终返回-1

时间:2017-10-31 16:50:15

标签: c++ macos qt process

我在Mac上使用Qt 5.我在QMainWindow中有一个按钮,当它点击它时执行一个程序。

我使用这个静态函数来执行一个分离的进程:QProcess :: startDetached(http://doc.qt.io/qt-5/qprocess.html#startDetached)。

在Mac上使用此功能启动/终止进程没有问题。

我想确定用户是否终止进程(OpenGL应用程序)。我用过这段代码

void MyProgram::startApplication()
{
bool ret = QProcess::startDetached(program,arguments, workingDirectory, &m_PID);
if (ret && m_PID)
{
    printf("m_PID = %d (started)\n", (int)m_PID);
    QThread* thread = new QThread;
    connect(thread, &QThread::started, [this]() {
        qint64 pid = m_PID;
        printf("pid = %d (started)\n", (int)pid);
        QThread::msleep(2000);
        while (pid)
        {
            int wstatus = 0;
            pid_t ret = waitpid(pid, &wstatus, WNOHANG);
            if (ret > 0)
            {
                if (WIFSIGNALED(wstatus) || WIFSTOPPED(wstatus) || WIFEXITED(wstatus))
                {
                    // dont kill or stop cuz the process is already finished
                    printf("pid = %d ret = %d (stopped)\n", (int)pid, (int)ret);
                    break;
                }
            }
            else if (ret < 0)
            {
                printf("pid = %d ret = %d(error)\n", (int)pid, (int)ret);
                //break;
            }
            QThread::msleep(200);
        }
        m_PID = 0;
    });
    }

   bool MyProgram::IsRunning()
   {
       return m_PID != 0;
   }

这个问题是waitpid()总是返回-1,我不知道启动进程何时完成或被杀死。

我认为waitpid只有当你在分离进程中重新使用parent时才能工作但kill(m_PID,SIGINT)有效(停止进程)

我只需要知道过程是否完成

1 个答案:

答案 0 :(得分:1)

QProcess::startDetached记录:

  

Unix:已启动的进程将在其自己的会话中运行,并像守护进程一样运行。

(所以我猜它会调用daemon(3)或做同等的事情)

如果你真的想使用waitpid(2),你最好在自己的代码中使用通常的fork(2)execve(2)(但这不是Qt的做法)。

顺便说一句,你为什么不以通常的方式使用QProcess?它应该更Qt友好(并且更容易移植到其他操作系统)。您将slot qt信号使用(即连接到QProcess::finished的某些部分)。

  

但kill(m_PID,SIGINT)有效

当然,kill(2)可用于某些非子进程。