2017-03-09 5 views
1

fork()を2回呼び出して子プロセスを2つ作成しています。子プロセスAがexec()呼び出しと子プロセスBを実行してexec()呼び出しを実行したい。私が与えられたコードで問題を抱えているのは、子プロセスAからの最初のexec()の後に、次のfork()が発生せず、プログラムが終了するということです。 exec()が親プロセスをオーバーレイする方法と関係していると思います。達成したいのは、fork()によって作成された各子プロセスからexec()を呼び出すことです。fork()とexec()2つの子プロセス

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <sys/wait.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <iostream> 

int main() { 

pid_t cpid_a, cpid_b; 

cpid_a = fork(); 
if(cpid_a < 0) { 
    std::cout << "Fork failed." << '\n'; 
    return 1; 
} 
else if(cpid_a == 0) { // code for child process A 
    execlp("/bin/ls", "ls", NULL); 

    cpid_b = fork(); 
    if(cpid_b < 0) { 
     std::cout << "Fork failed." << '\n'; 
     return 1; 
    } 
    else if(cpid_b == 0) { // code for child process B 
     execlp("/bin/ls", "ls", NULL); 
    } 
} 
else { // code for parent process 
    while(wait(NULL) != -1); 
} 
return 0; 
} 
+0

'execlp'が返された場合は、失敗したためです。エラーを処理する以外は何もしないexeclの呼び出しの後でコードを決して持つべきではありません。 –

+0

IOWの場合、あなたの子はexeclを呼び出す必要があり、親は 'fork'をもう一度呼び出す必要があります。 –

答えて

1
else if(cpid_a == 0) { // code for child process A 
    execlp("/bin/ls", "ls", NULL); 

この呼び出しは、次のステートメントを成功し、次のものは、これまで実行されません場合。それはexec()の仕組みです。直後のfork()は発生しません。それは単にexec()の仕組みです。 exec()が成功した場合、それは返されません。置換処理がその場所で実行されます。

「子プロセスAのコード」の上に100%正しいコメントを追加しました。 if()ステートメントの中のすべてが "子プロセスAのコード"で、fork()が0を返したときに実行されます。

また、親プロセスが2番目のプロセスをフォークするように指定したことを正しく示しました。さて、あなたはコードは明らかに親プロセスで実行を受けることはなく、子プロセス持っている必要があります。

else if(cpid_a == 0) { // code for child process A 
    execlp("/bin/ls", "ls", NULL); 
    exit(1); 
} else { 
    cpid_b = fork(); 

    // The rest of the code. 

今、親プロセスが先に行くとfork()二時間を、休憩に進めあなたの計画の

P.S. exit()はちょうど良い措置です。 exec()が返す唯一の時間は、exec()が与えられたプロセスの実行に失敗したときです。非常にありそうもなく、/bin/lsの場合;行方不明の場合は、大きな問題があります。それでも、それは技術的に正しいことです。その時点で実行を続けると完全な混乱が生じるためです。繰り返しますが、/bin/lsが見つからない場合は、問題の最小限に抑えられますが、システムにメモリ不足が発生し、その理由で実行できない場合も同様です。その場合、火に燃料を加える必要はありません。とにかくプロセスが死んでしまう。

関連する問題