0

ここで助けが必要です。プログラムを実行したら、3 つの execlp() をすべて実行する必要がありますが、case 0 のみが実行されます。pid を 1 に変更すると、case1 が実行されます。forループに入れようとしましたが、うまくいきません。break を continue に変更しましたが、同じです - 1 つのプロセスだけが実行されます。助言がありますか?

主要(){

pid_t pid;
pid= fork();
int i;

if(pid==0){

    for (i=0; i<3; i++){
        switch (i){
            case 0:
            execlp("/bin/cat", "cat", "wctrial.txt", NULL);
            break;

            case 1:     
            execlp("/bin/mkdir", "mkdir", "mydirectory", NULL);
            break;

            case 2:
            execlp("/bin/wc", "wctrial.txt", NULL);
            break;
        }
    }


}else{
    wait(NULL);
    printf("Child process completed!");
    exit(0);
}

}

4

2 に答える 2

6

によるとman execlp

exec()関数ファミリーは、現在の プロセス イメージを新しいプロセス イメージに置き換えます。

(強調は私です)

したがって、正常に呼び出されるとexeclp、プロセスは古いコードを再実行しません。

case 0:
    execlp("/bin/cat", "cat", "wctrial.txt", NULL);
    /* shouldn't go here */
    break; 

3 つのプログラムを実行する場合は、3 つのプロセスを作成できます。例 (展開されたループ):

pid_t son;

son = fork();

if (son == -1) /* report */
else if (son == 0) execlp("/bin/cat", "cat", "wctrial.txt", NULL);
else wait(NULL);

son = fork();

if (son == -1) /* report */
else if (son == 0)  execlp("/bin/mkdir", "mkdir", "mydirectory", NULL);
else wait(NULL);

/* ... */
于 2013-03-03T17:01:53.190 に答える
0

キリレンコの答えも参照してください。system(..)解決策は、の代わりに使用することですexeclp(..)

マニュアルページはこちら

于 2013-03-03T17:08:52.353 に答える