即使进程终止,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的主要内容,如果未能解决你的问题,请参考以下文章