• ベストアンサー

forkについて

fork文を使った問題について質問です。 #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid1,pid2; if((pid1 = fork()) == 0) printf("I am a first child with pid = %d,My parent pid is %d.\n",getpid(),getppid()); else if(( pid2 = fork()) == 0) printf("I am a second child with pid = %d,My parent pid is %d.\n",getpid(),getppid()); else printf("I am a parent with pid = %d.\nMy first and second children are %d and %d.\n",getpid(),pid1,pid2); exit(EXIT_SUCCESS); } このようなプログラムが与えられました。 問題は 1.このプログラムを改造して、1つの親プロセスから100の子プロセスを順に生成するプログラムをつくるというものと 2.1つの親から子プロセスを生成し、その子プロセスの孫プロセスを生成するプログラムをつくれというものです。 1はfor文を使えばできそうなのですが、forkの基礎が出来ていないのでどうループを回せばよいか分かりません。 2もfork内でforkを実行すればできそうだと思ったのですがうまく動かず・・・。 どうか正しく動くようなプログラムを教えてください!お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#119918
noname#119918
回答No.2

ざっと書いてみました。 1. fork -> 親プロセス) 子プロセスの終了を待ち、再びfork -> 子プロセス) 自身のプロセスIDを表示し、直ちにexit 2. fork -> 親プロセス) 子プロセスの終了待ち -> 子プロセス) 再びfork、孫プロセスの終了を待ち、直ちにexit -> 孫プロセス) 直ちにexit 上のような流れのプログラムです。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> void problem1(void); /*問題1*/ void problem2(void); /*問題2*/ pid_t Fork(void); /*forkのエラーをトラップするラッパ関数*/ void Wait(int *status); /*waitのエラーをトラップするラッパ関数*/ int main(void) { problem1(); problem2(); return 0; } void problem1(void) { int i; pid_t pid; for(i=0 ; i<100 ; i++) { printf("loop %d\n" , i); pid = Fork(); if(pid == 0) /*child process*/ { printf("child %d\n" , getpid()); exit(EXIT_SUCCESS); } /*parent*/ Wait(NULL); /*wait for child*/ } } void problem2(void) { pid_t pid0; pid_t pid1; pid0 = Fork(); if(pid0 == 0) /*child*/ { printf("child.\n"); pid1 = Fork(); if(pid1 == 0) /*grand child*/ { printf("grand child.\n"); exit(EXIT_SUCCESS); } /*child*/ Wait(NULL); /*wait for grand child*/ exit(EXIT_SUCCESS); } /*parent*/ Wait(NULL); /*wait for child*/ } pid_t Fork(void) { pid_t pid = fork(); if(pid < 0) { perror("fork"); exit(EXIT_FAILURE); } return pid; } void Wait(int *status) { if(wait(status) < 0) { perror("wait"); exit(EXIT_FAILURE); } }

gachaa
質問者

お礼

教えていただいたプログラムを元につくってみたところうまく動きました! ありがとうございます! どうやらwaitを考えるのが足りなかったみたいなので勉強してきます。ありがとうございました。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

> 1はfor文を使えばできそうなのですが、forkの基礎が出来ていないのでどうループを回せばよいか分かりません。 >2もfork内でforkを実行すればできそうだと思ったのですがうまく動かず・・・。 うまくいかなかったソースを出してみませんか?

gachaa
質問者

補足

/*1のソース*/ int main(){ pid_t pid[99]; int i; for(i=0;i<100;++i){ if((pid[i] = fork()) == 0) printf("I am a child with pid = %d,My parent pid is %d.\n",getpid(),getpid()); } } これでやったら無限ループしてしまいました。 かといって exit(EXIT_SUCCESS); を加えれば1回で止まってしまいます。 /*2のソース*/ if((pid1 = fork()) == 0) pid2 = fork(); printf("I am a child with pid = %d,My parent pid is %d.\n",getpid(),getppid()); exit(EXIT_SUCCESS); このようにしようとしたのですが、うまくいきませんでした。 printfも明らかにうまくいきそうにないですけど、どうすればよいか分からなくて・・・。 どうか上手く動くプログラムを教えてください。

関連するQ&A