我使用QProcess
在服務器上進行冗長的計算。只要我自己完成,它可能只需要幾秒鐘或幾個小時,並且工作正常。但是,我需要有可能在完成之前終止進程,這隻能在我的Windows機器上正常工作。QProcess :: kill()不會在linux中終止子節點
在linux中,我的QProcess
被終止,並且我的數據處理被成功執行,但是由它產生的子進程仍然存在。下面是我的代碼的摘錄:
// constructor
server::server(QObject* parent) : QTcpServer(parent)
{
this->calc_proc = new QProcess(this);
QObject::connect(this->calc_proc, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(calc_finished(int,QProcess::ExitStatus)));
...
}
void server::start_job(){
QString working_directory = "...";
QString input_file = "...";
QStringList arguments;
arguments << "memory=max" << "batch=no" << input_file;
this->calc_proc->setWorkingDirectory(working_directory);
this->calc_proc->start("path_to_external_program", arguments);
qDebug() << "Calc started with pid: " << this->calc_proc->pid();
}
void server::kill_job(){
this->calc_proc->terminate();
//this->calc_proc->kill();
}
行爲似乎並沒有使用terminate()
或kill()
時有所不同。子進程是我的子進程,據我所知:
Calc started with pid: 26395
ps ax
...
26441 pts/0 S 0:00 time /msc/MSC_Nastran/20131/msc20131/linux64/analysis
26442 pts/0 Rl 16:59 /msc/MSC_Nastran/20131/msc20131/linux64/analysis
...
ps -p 26442 -o ppid=
26441
ps -p 26441 -o ppid=
26395
我QProcess
返回他的PID爲26395其中有一個小孩26441其中有一個孩子26442.所以我希望所有的這些被殺害的時候我殺了我的。如所述,他們生存下來是否有任何平臺無關的方式來殺死這些?
更清晰的解決方案是在產卵時保存孩子的PID,而不是解析'ps'輸出。無論如何,你的代碼依賴於操作系統('ps --ppid' - GNU only?)。 – Matt 2015-03-19 08:53:22
這將是更清潔,但它不是我的代碼產生的孩子。我只是開始一個外部程序,在某種程度上,這個程序會在我不知情的情況下產生孩子。 'ps --ppid'在[unix manpages]上(http://unixhelp.ed.ac.uk/CGI/man-cgi?ps),所以我期望它能在Linux上運行。並不需要在我的情況下爲Windows – Bowdzone 2015-03-19 09:04:13
我的意思是'--ppid'是GNU選項,所以它只適用於GNU/Linux。 BSD和Solaris等都不能工作。所以它很髒。 – Matt 2015-03-19 09:14:12