即使进程终止,waitpid 总是返回 -1

Posted

技术标签:

【中文标题】即使进程终止,waitpid 总是返回 -1【英文标题】:waitpid always returns -1 even if the process is terminated 【发布时间】:2017-10-31 16:50:15 【问题描述】:

我在 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 仅在您是分离进程中的父节点时才有效,但 kill(m_PID, SIGINT) 有效(停止进程)

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

【问题讨论】:

【参考方案1】:

QProcess::startDetached 文件表明:

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

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

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

顺便说一句,你为什么不像往常一样使用QProcess?它应该对 Qt 更友好(并且对其他操作系统更便携)。您将使用(即连接到您的某些slot)QProcess::finished qt 信号。

但是 kill(m_PID, SIGINT) 有效

当然,kill(2) 可以用在一些非子进程上。

【讨论】:

以上是关于即使进程终止,waitpid 总是返回 -1的主要内容,如果未能解决你的问题,请参考以下文章

进程控制---wait 和 waitpid 函数详解

linux下system函数调用shell命令后,怎样让主进程等子进程返回后,接着执行

wait,waitpid学习测试

进程控制---子进程终止状态相关的宏

函数wait和waitpid

wait,waitpid