2015-10-14 132 views
1

我有一个启动另一个应用程序的Qt应用程序。如果子应用程序在外部终止,我想接收一个信号。Qt句柄进程终止

的代码是:

CaptureApp::CaptureApp(int& argc, char** argv): QApplication(argc, argv) 
{  
    launchDaemon(); 
} 

void CaptureApp::launchDaemon() 
{ 
    QString command = "daemon"; 
    QStringList arguments; 
    arguments << "somearg"; 
    process = new QProcess(this); 
    process->start(command, arguments); 
    connect(process,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(daemonDied(QProcess::ProcessState))); 
    connect(process,SIGNAL(finished(int)),this,SLOT(daemonDied(int))); 
} 
void CaptureApp::daemonDied(QProcess::ProcessState state) 
{ 
    std::cout << "DAEMON DIED" << std::endl; 
} 

void CaptureApp::daemonDied(int code) 
{ 
    std::cout << "DAEMON DIED" << std::endl; 
} 

但是,当我杀子过程中出现的任何消息。我究竟做错了什么?

+0

什么是'spaceNavProcess'?你为什么不改用'process'呢?我也怀疑杀死一个进程会触发任何信号。 – vahancho

+0

@vahancho对不起,这里复制代码时出错。最初的名字是好的 – Lecko

+0

守护进程是否正在启动一个实际的,写得很好的守护进程?如果是这样,它将从其父母分离。你可以用'pstree'或'ps aux'来检查这个守护进程是否成为PID 1的子进程('init'或'systemd'或其他)。注意:这就是为什么Qt特别是用于启动守护进程(或者模拟一个写得很好的守护进程,它将从它的父进程中分离出来)的'QProcess :: startDetached()'。 – jbm

回答

1

我想你的例子来自QApplication inherriting,但在首位,这给了我这个错误:

QObject::connect: No such slot QApplication::daemonDied(QProcess::ProcessState) 
QObject::connect: No such slot QApplication::daemonDied(int) 

我加入Q_OBJECT类定义,并将其连接的信号/插槽,但是当我杀过程它给了以下错误:

ICE default IO error handler doing an exit(), pid = 27773, errno = 4 

当我然而改变了类从QObject,而不是QApplication它的工作继承。因此,具有主:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    CaptureApp captureApp(argc,argv); 

    return a.exec(); 
} 

正如评论说JBM,一些流程保持连接,而另一些则没有。我第一次尝试gedit,它在开始后直接收到一个信号,表示过程已经完成。然而,它使用vim继续运行,我能够从外部杀死它。