2014-02-28 61 views
0

考慮這個EXECL中分離線程 - 查殺方法(C++ STD 11)

#include <cstdio> 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <cstdlib> 
#include <vector> 
#include <string> 
#include <iterator> 
#include <cmath> 
#include <thread> 
#include <cerrno> 
#include <cstring> 

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <getopt.h> 

#include <boost/algorithm/string.hpp> 

#include "utils.cpp" 
#include "pstream.h" 
//pstream is the process stream library as below 
void doThings() 
{ 
while(not exitflag, a global){ 
if(some condition) {execl (a bash script); std:cout << "this text will never get printed, process ends at execl" <<endl;} 
}}} 

int main() 
{//detach doThings as a thread here 

} 

我可以保證的是,全球exitflag沒有設置,也將被印在std ::法院線,甚至標誌被設置,因爲在打印信息之前,沒有命令可以中斷並跳到結尾,以便解除終止。

我做錯了什麼?順便說一句:shell腳本運行完美。

編輯:(感謝MiniTech移動)我不想原單程序死

並行線程:http://sourceforge.net/projects/pstreams/files/pstreams/Release%200.8.x/

+0

我不知道你在問什麼。你能否展示你得到的結果和你期望的結果? – Ryan

回答

4

execl's documentation

的執行exec()函數系列替換當前的進程圖像 一個新的過程映像。本手冊頁中描述的功能爲execve(2)的前端 。 (參見execve的手冊頁(2) 關於更換當前的進程映像的進一步的細節。)

你應該總是電話調用fork之前execl如果你不想原來的程序死。

+2

並不總是,但幾乎總是如此。首先不調用fork()的原因往往是古怪的情況,就像SUID包裝程序,在運行另一個程序之前需要在進程的環境中調整某些東西(儘管這通常使用'execv()'或'execve ()' - 而不是'execvp()' - 因爲它可能會將用戶的參數傳遞給執行的程序,但是,第一個近似值,'always'將會執行,而且你完全正確的是exec *( )'終止一個進程中的所有線程 –

+0

剛剛編輯答案,謝謝你的喚醒電話:) –

+0

NP - 我不能給你第二個票,我害怕。 –