我在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)有效(停止进程)
我只需要知道过程是否完成
答案 0 :(得分:1)
Unix:已启动的进程将在其自己的会话中运行,并像守护进程一样运行。
(所以我猜它会调用daemon(3)或做同等的事情)
如果你真的想使用waitpid(2),你最好在自己的代码中使用通常的fork(2)和execve(2)(但这不是Qt的做法)。
顺便说一句,你为什么不以通常的方式使用QProcess?它应该更Qt友好(并且更容易移植到其他操作系统)。您将slot qt信号使用(即连接到QProcess::finished的某些部分)。但kill(m_PID,SIGINT)有效
当然,kill(2)可用于某些非子进程。