2012-10-26 145 views
0

我想從一個主進程創建多個進程。我知道我想使用exec系列的一個功能,但它似乎並沒有按照我的意圖進行預成型。看起來,exec()是一個阻塞調用,或者我只是用它錯了。總之,到代碼:從主進程執行多個進程

const char* ROUTERLOCATION = "../../router"; 
int main(int argc, char** argv) { 
    manager manager; 
    vector<string> instructions = manager.readFile(argv[1]); 
    ... 
    //file gives me the number of proceses i want to spawn and that value goes in 
    //rCount 
    for(int i = 0; i < rCount; i++){ 
    cout << "creating:" << i << endl; 
    execl(ROUTERLOCATION, "",NULL); 
    } 
} 

我看到的輸出是:

creating:0 
HI!!! 

然後一切正常退出。我不能使用execl()產生多個進程嗎?

此外,我想與這些進程中的每一個進行通信,所以我不希望在這些進程正在運行時被阻塞。

+1

哪裏'fork'打電話?你需要調用它,如果它表明你是子進程,那麼你執行'exec'。父母繼續跑步和分娩孩子。孩子們都會用自己想要運行的程序取代自己。 – paddy

回答

2

您需要在您的主進程中fork,在您的子進程中調用execl。 (exec函數系列用您的新過程替換您當前的過程映像,因此爲什麼您的for循環從未完成。)

+0

如果我岔開主人,是不是所有的孩子都會讀這個文件呢? – nook

+0

我不知道你的readFile是做什麼的,但是如果它只是讀取文件然後關閉它並返回結果,那麼如果你在之後(在你的execl之前)fork,那麼它不會重新讀取文件,執行從你分叉點開始。您的孩子將擁有父母所做的一切副本,至少在調用execl之前(然後所有內容都被替換)。 – hexist

+1

您是對的。謝謝。接受你,因爲你是第一個。非常感謝。 – nook

1

調用exec()意味着您的當前程序不再存在。您可能需要使用fork()創建一個新進程,然後在其中調用exec(),以便exec()取代您的新進程,並且您的主進程仍然按照您的要求運行。

例如:

pid_t pid = fork(); 
if (pid == 0) {// child 
    execl(); 
} else { // parent 
}