6

使用しなければならない宿題をしようとしていますfork()が、forループを実行した後、フォークを停止できない理由がわかりません。

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

int main(int argc, char *argv[]){
    int limit = argc/2;
    if(argc%2 == 0){

            perror("the number of arguments given must pe even!");
            exit(1);
    }

    int i;
    for(i=0; i<=limit; i++){
        if(fork()==-1){
            perror("childes couldn't be created\n");
            exit(1);
        }
        if(fork()==0){
            printf("fork: %d \n",i);
            exit(1);
        }
        wait(0);
    }


    printf("exiting...\n");
    return 0;
}

出力:

warzaru@ubuntu:~/OS/UprocH$ ./exe a b c d
fork: 0 
fork: 0 
fork: 1 
fork: 1 
fork: 1 
fork: 2 
fork: 2 
fork: 1 
fork: 2 
exiting...
exiting...
fork: 2 
exiting...
exiting...
fork: 2 
exiting...
exiting...
exiting...
warzaru@ubuntu:~/OS/UprocH$ fork: 2 
fork: 2 
fork: 2 
exiting...
4

2 に答える 2

15

ダニエル・フィッシャーは私に答えを提供するように強制しました。

変化する:

if(fork()==-1){} // first fork
if(fork()==0){}  // second fork

に:

pid = fork();
if(pid == -1)
{
    ... //failed
}
else if(pid == 0)
{
    ... //success
}

または、switchステートメントを使用します。

switch(fork())
{
    case -1:
        ... // failed
        break;
    case 0:
        ... // success
        break;
}
于 2012-05-03T21:28:55.520 に答える
0

execl()またはexecの他のバリアントを使用できます。これにより、作成される子が親から何も継承しないことが保証されます。これにより、指数関数的な子の爆発を発生させることなく、forループを使用して子を作成できます。execl関数の引数を適切に変更すると、次のような3つのプロセスを作成できます。

main()
{
    int i,pid[3];
    for(i=0;i<3;i++)
    {
        pid[i]=fork();
        if (pid[i]==0)
            execl("path",0,0);
    }

    sleep(2);
}
于 2014-08-28T14:22:15.453 に答える