5

ここにコードがあり、厳密に ls -l を 5 回実行すると予想していましたが、それよりもはるかに多く実行されているようです。ここで何が間違っていますか?ls を 5 回実行したいので、5 回 fork します。待つという概念をちゃんと理解していないのではないでしょうか?私はたくさんのチュートリアルを調べましたが、フォークを使用して複数のプロセスに徹底的に取り組んでいるようには見えません。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
    pid_t pidChilds[5];

    int i =0;

    for(i = 0; i<5; i++)
    {
        pid_t cpid = fork();
        if(cpid<0)
            printf("\n FORKED FAILED");
        if(cpid==0)
            printf("FORK SUCCESSFUL");
        pidChilds[i]=cpid;
    }





}
4

3 に答える 3

3

ループで fork しており、 fork は命令ポインターを含むプロセスを準コピーします。

意味:たとえば、最初の子プロセスは、まだ 4 ラウンド残っているループに陥ります

そして、スポーンを処理する 4 つのプロセスのそれぞれが、さらに3 ラウンド実行する必要があることを発見します。

等々。

fork()現在のプロセスが親プロセスか子プロセスかを返します。break;子プロセスにいる場合は、その戻り値とループを確認する必要があります。

" 成功すると、子プロセスの PID が親に返され、0 が子に返されます。失敗すると、親に -1 が返され、子プロセスは作成されず、errno が適切に設定されます。"

だからあなたはすべきif(cpid==0) break;です。

于 2013-03-07T14:43:47.190 に答える
2

C で fork を使用する場合、プロセス コードと状態が新しいプロセスにコピーされ、その時点で中断したところから実行が開始されることを想像する必要があります。

C で exec を使用する場合、呼び出しが成功するとプロセス全体が置き換えられることを想像する必要があります。

期待される動作を生成するために書き直されたコードを次に示します。コメントをお読みください。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
    pid_t cpid;
    pid_t pidChildren[5];

    int i;
    for (i = 0; i < 5; i++)
    {
        cpid = fork();
        if (cpid < 0) {
            printf("fork failed\n");
        } else if (cpid == 0) {
            /*  If we arrive here, we are now in a copy of the
                state and code of the parent process. */
            printf("fork successful\n");
            break;
        } else {
            /*  We are still in the parent process. */
            pidChildren[i] = cpid;
        }
    }

    if (cpid == 0) {
        /*  We are in one of the children;
            we don't know which one. */
        char *cmd[] = {"ls", "-l", NULL};
        /*  If execvp is successful, this process will be
            replaced by ls. */
        if (execvp(cmd[0], cmd) < 0) {
            printf("execvp failed\n");
            return -1;
        }
    }

    /* We expect that only the parent arrives here. */
    int exitStatus = 0;
    for (i = 0; i < 5; i++) {
        waitpid(pidChildren[i], &exitStatus, 0);
        printf("Child %d exited with status %d\n", i, exitStatus);
    }

    return 0;
}
于 2013-03-07T15:13:52.183 に答える
0

すべてiの 'thは loop 内でfork開始されるため、そのループの残りの繰り返しを実行し、再帰的に分岐します。n-i

于 2013-03-07T14:43:49.630 に答える