stdinからの必要なプロセス数のユーザー入力を受け入れる小さなプログラムを作成したいと思います。その後、私のプログラムは、ユーザーが指定したn個のプロセスをフォークします。後で、子から親にデータをパイプしたいと思います。
ただし、親プロセスは1つだけ必要です。私はこれのためのアルゴリズムを理解しようとしてきました、そして多分私はそれを過度に複雑にしています、しかし私は立ち往生しています。
私はCでフォークとパイプの機能しか使用できないことに注意してください(だから、あまりクレイジーではありません!)
これが私のアルゴリズムです。
親プロセスの場合にのみループし、子プロセスの場合はループしません。
私がループに入る親プロセスである場合は、fork()を呼び出します。それ以外の場合、私は子供であり、子供に関連するいくつかのタスクを実行します(後で親にパイプで戻すことができます)。子プロセスの作成を回避するために、子はループに再び入るべきではありません。
それは意味がありますか?
あなたは私に何をするようにアドバイスしますか?
たとえばn
、入力として取得する子の数です。子供ごとに1つのパイプを使用する場合、何ができるか見てみましょう。
親プロセスの場合:
pid_t pid;
int fd[n][2];
for(i = 0; i < n; i++) {
pipe(fd[i]);
pid = fork();
if (pid < 0) {
perror("whatever");
exit(1);
}
else if (pid == 0) {
for(j = 0; j < i; j++) {
if (close(fd[j][0]) < 0) {
perror("closing fd[0]");
exit(1);
}
if (close(fd[j][1]) < 0) {
perror("closing fd[1]");
exit(1);
}
}
func(fd[i]);
}
}
// other parent stuff next && close file discriptors not needed
そして、あなたfunc()
は子供たちがしなければならないことでなければなりません。子のパイプの2つのファイル記述子を引数として取ります。最後にfunc
すべきであることに注意してくださいexit()
。
各子のパイプを作成するソリューションは、それよりも少し優れていますが、少し複雑です(ヒント:fdを引数として渡すこともできますが、すべてのfdを注意して閉じることもできます!)
また、の代わりにをpid
定義することで各子を保持し、各pidを。として参照することもできます。pid_t pid[n];
pid
pid[i]
すべての子供が死ぬのを待つことを忘れないでください!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加