• ベストアンサー

子プロセスの利点

プロセスについての質問なのですが、 親プロセスでプログラムを実行するのではなく、 子プロセスを生成してその上でプログラムを実行する利点などはどのようなことがあるのか? わかる方がいらしたら質問にお答えいただけると幸いです。

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

  • ベストアンサー
回答No.1

例えば残高照会の処理だとすると、複数の利用者に同じサービスを提供しなければなりません。 こうした場合に親プロセスは子プロセスを起動して、その子プロセスに残高照会プログラムを実行させます。 1台のコンピューターを複数の人が同じサービスを受ける事が可能となります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.2

たとえば、子プロセスごとに単純な機能で実装すればエンバグの可能性を減らせます。インターフェースの互換さえ保てば部分的なアップデートも可能です。 また、特定の子プロセスがセキュリティホールを持っていても他への影響を抑えられます。 一部 Visual Basic などのように、言語としてマルチスレッドをサポートしていない場合にプロセスを分けることで、マルチスレッド化することができます。子プロセスがビジーでも部分的に処理を継続できます。 とりあえず見たことのある事例から。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 子プロセス、

    親プロセスから子プロセスを生成するとは具体的に何を意味しているのでしょうか? またresume文とはなんでしょうか? 何をしてくれているのでしょうか? なぜUNIXは安定していると言われるのでしょうか? 聞いたけど忘れてしまいました、 お願いします。

  • 子プロセスと親プロセス

    ある本を読んでいると、以下のような問いにぶち当たり、プログラムの仕方がよくわからないのです。 自分でもいろいろ調べたのですが、わからないので質問させていただきます。 自分のプロセスIDと親のプロセスIDのプロセスIDを表示するコマンドshowpidを作り、showpidを子プロセスとして10回実行するプログラムを作りなさい。ただし、execを用いてshowpidを10回実行すること。 というものなのですが、自分のプロセスIDと親のプロセスIDの表示方法はわかったのですが、それをコマンドとして作り、子プロセスとして10回実行する方法がわからなくて困っております。。。 言語はc言語を使ってもらいたいです。以下に自分のプロセスIDと親のプロセスIDを表示するプログラムを付けときます。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(){ pid_t pid; int status; if((pid=fork())==0) printf("I am a child with pid=%d. My parent pid is %d.\n",getpid(),getppid()); else{ wait(&status); exit(EXIT_SUCCESS); }

  • プロセスの生成(fork)

    私はLinuxを始めたばかりのタコです。 参考書で少しずつ勉強しているのですが 「プロセスの生成にはforkを使用する」と記載されており プログラム例も載ってはいるのですが親プロセスと子プロセス一個の ケースしか記載されていません。 例にはPIDが0か0以外で親子を判断して別処理をさせると書いてありました。 例えば親プロセスと子プロセス2個以上を生成するにはどうしたらいいのでしょう?超ビギナーな質問で申し訳ありませんがタコを育てると思って どうか御教え下さい。宜しく御願いします。

  • 子プロセスの状態を親プロセスに渡したい

    今、C言語を用いてシェルを作成していて、そこでcpコマンドを実現したいと思っています。その際、子プロセスを生成し、そこでgetcwdやchdirを使用してディレクトリの移動を行うのですが、子プロセスを終了させると親プロセスでは移動前のディレクトリに戻ってしまいます。 子プロセスでディレクトリを移動したときに,親プロセスでも移動された状態にするにはどうすればいいのでしょうか?それとも、この操作は親ディレクトリでしか行えないのでしょうか? できるだけ詳しく教えていただけるとありがたいです。回答よろしくお願いします。

  • httpdの子プロセスがゾンビ化する原因

    httpdは複数の子プロセスを生成しますが、この子プロセスがゾンビプロセス化してしまう ことがあります。 このゾンビ化してしまう原因として考えられるものを教えて下さい。 『何らかの理由で子プロセスが停止せずに親プロセスが停止した』等、あいまいな答えでも 構いません。もちろん具体的であれば、とても助かりますが…。 思いつく限りいくつでも構いませんので、教えて下さい。 ちなみに、私が使用しているマシンで上記現象が発生している訳ではなく、一般的な事例として 子プロセスのゾンビ化の原因になり得る事象を知りたいと思っていますので、構成情報などは あまり気にせずに答えて頂けると幸いです。 よろしくお願いします。

  • プロセスの生成

    #include<stdio.h> #include <unistd.h> main(){ int i; printf("\t(%s)プロセスID.....%d\n","元",getpid()); printf("\t(%s)親プロセスID...%d\n","元",getppid()); if((i=fork())==0) { //子プロセスで実行する部分 printf("\t子プロセスでのfork()の値 : %d\n",i); printf("\t(%s)プロセスID.............%d\n","子",getpid()); printf("\t(%s)親プロセスID...........%d\n","子",getppid()); printf("子プロセスを終了します\n"); } else{//親プロセスで実行する部分 printf("\t親プロセスでのfork()の値 : %d\n",i); printf("\t(%s)プロセスID.............%d\n","親",getpid()); printf("\t(%s)親プロセスID...........%d\n","親",getppid()); printf("親プロセスを終了します\n"); } } fork関数の振る舞いについてです。 上記のプログラムをgccでコンパイルして実行した場合出力結果が /_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ (元)プロセスID.....375 (元)親プロセスID...246 親プロセスでのfork()の値 : 376 子プロセスでのfork()の値 : 0 (子)プロセスID.............376 (子)親プロセスID...........375 子プロセスを終了します (親)プロセスID.............375 (親)親プロセスID...........246 親プロセスを終了します _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ という感じで出力されました。 fork関数がプロセスの複製を行っていることと、戻り値が0と376の2つであることはわかりました。 また子プロセスには0を親プロセスには376を返すこともわかりました。 感覚的にはif文の真である子プロセス側の記述文と偽である親プロセス側 の記述文が同時に実行されているのではないかと考えましたが 同時に実行されているのに printf("\t子プロセスでのfork()の値 : %d\n",i); printf("\t親プロセスでのfork()の値 : %d\n",i); で表示される値が違うのはなぜでしょうか。 i=fork()によって代入されているのはわかるのですが、 同時に実行されつつ何故2つの違う値をiは出力できるのかがわかりません。 また出力結果が _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ (元)プロセスID.....377 (元)親プロセスID...246 親プロセスでのfork()の値 : 378 (親)プロセスID.............377 (親)親プロセスID...........246 親プロセスを終了します 子プロセスでのfork()の値 : 0 (子)プロセスID.............378 (子)親プロセスID...........1 子プロセスを終了します _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 子プロセスから見たときの親プロセスが1となっているのは何故でしょうか? 本来ならば377ではないでしょうか? わかりにくい説明ですいません。 よろしくお願いします。

  • 子プロセスの実行順序について

    次のコマンドでは、外側のechoの出力内容のコロン(:)の左側で子プロセスによって変数iの値を出力し、その後値をインクリメントしています。右側では親プロセスで同じことを行なっています。 echo "`echo $((i++))`:$((i++))" 子プロセスの内容を先に処理してから親プロセスが残りの内容を実行すると推測し、その場合、コロンの左右で値は右側が大きくなるはずです。 しかし、実際は値は左右変わらず、同じ値が出力されます。 これは子プロセスと親プロセスが並行して処理を行なっているからでしょうか? 右側でインクリメントした値はどこへ行ったのでしょうか? 詳しい方いらっしゃいましたら、解説をお願いします。

  • Linuxで生成したプロセスに処理をさせるには?

    Linuxの学んでいる者です。 表題の件について、本を読んだり、ネットで検索したり したのですが、解決ができなかったため質問させて いただきました。 以下に例を挙げます。 1つのCファイルに、「main」と「A」と「B」という関数があるとします。 「main」関数にて、fork()で2つプロセスを生成し、一方のプロセスでは 「A」関数を実行し、もう一方では「B」という関数を実行させます。 「A」という関数は3秒ごとに「1,2,3,…」と数字を出力するもので、 「B」という関数は5秒ごとに「10、20、30、…」と数字を出力するものとします。 こういう場合に、プロセスに「A」や「B」の処理を実行させることができません。 exec関数でプロセスに別のプログラムを実行させることはできますが、 プログラムの実行ファイルのパスを指定して実行させるようなので、 この場合にはうまく使えません。 理解されている方には、本当に些細なことではあると思いますが、 私では解決にまで至らなかったので、ご教授いただければ幸いです。 よろしくお願いいたします。

  • 子プロセスのデータを親プロセスに渡す方法ってありますか。

    こんにちは。 C言語内でfork()関数を使い親と子を分け、子プロセス間で生成されたデータを親プロセス側に渡して処理したいと考えています。要は、プロセス間でデータのやり取りをpipe()関数かなにかで行いたいと思っています。 子プロセスがデータをテキストファイルでどこかに出力して、それを親プロセスが参照する、というテキストファイルを橋渡しにする原始的な方法があるにはあるのですがこれは最終手段にしたいと考えています。他に良いやり方があればご教授いただけないでしょうか。 以下はサンプルコードです。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> int main(){ FILE *fp,*fp2; int fd[2],a,i = 0; pid_t pid; pipe(fd); char buff[1024]; pid = fork(); sigignore(SIGCLD); //ちゃんと子が死ぬようにする if(pid == 0){ close(STDOUT_FILENO); //画面に出力されないようにする dup2(fd[1],STDOUT_FILENO); close(fd[0]); fp = popen("tcpdump","tcpdump","tcp[13] & 255 == 2",NULL); } else{ sleep(1); //一秒だけ子プロセスを起動 kill(pid,SIGTERM); wait(); //完全に子プロセスを殺す fp2 = popen("wc -l fpのファイルデータ","r"); for(i=0;i<3;i++){ a = fgetc(fp2); putc(a,stdout); }printf("\n"); return 0; } } プログラムの内容は、 tcpdumpで処理(子プロセス)した内容を、wc -l で「行数」のみ取得する(親プロセス)というものです。あくまで目標ですが・・。^^; お手数でしょうが、どうぞよろしくお願いします。

  • 子プロセスの管理

    forkした後の子プロセス管理で、終了をsignalで管理しようと思ってるんですが、forkを2回行なえばゾンビ化を防げると書いてありました。この二つの方法に違いはあるんですか?メリット・デメリットがよくわかりません。ちなみに子プロセスからの結果や終了を待つ様なプログラムではなく、ただexec関数での別処理を行なうために子プロセスを作成するだけです。 宜しくお願いします。