• ベストアンサー

子プロセス、

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

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

  • ベストアンサー
  • TMINET
  • ベストアンサー率32% (45/140)
回答No.2

再レスです。 身近な例ですとエクセルとかで新規作成ボタンを押すと新しいシートが作られるじゃないですか。 いくつも作れてどれも同じ動作やインターフェースをしています。 それらのシートはボタンが押されるまで存在しなかったものです。 また、それらは独立しているので、どのシートに移動しても構いませんよね。 立派な子プロセスですよね。メモ帳なんかだと親プロセスが新たに開きますね。 この例ではユーザーの操作によるものですが、プログラムによっては内部でプロセスを作り並列的に動作するものもあります。

amuro_78
質問者

お礼

ありがとうございます、 このような答えを期待してました。 多分こんなことではないかと思っていたのですが、、、 そうなんですね、 ほんとありがとうございます。

その他の回答 (2)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

お疲れ様です。 親プロセスと子プロセスですが UNIXではforkというコマンドで 自分とまったく同じプロセスを複製する事ができます。 そのforkを実行したプロセスを親プロセス、作られた側を 子プロセスといいます。 通常はその後、自分のプロセスIDを見て自分が親か子かを判断し 親プロセスと子プロセスは違う動作をするようにプログラムされています。 UNIXが安定しているのは余計な事を一切していないからでしょう。 unixではバックグラウンドで動いているプロセス(デーモン) を自由に設定する事が可能できます。 resume文とはエラー処理などを行っている際、メインのプログラムに戻る 場合に使用します。

amuro_78
質問者

お礼

ありがとうございます、

  • TMINET
  • ベストアンサー率32% (45/140)
回答No.1

親プロセス、子プロセスの関係はメインルーチンとサブルーチンに似ていると思います。 「生成する」という表現はインスタンス化する際に初めて実オブジェクトとしてロードされるからだと思います。 resumeは一般的に「続行」を意味する命令だと思います。 UNIXはマルチユーザーマルチタスクOSとして一番歴史(25年)がありますし実績があります。 Winも10年そこそこ、Macなんてマルチタスクになったの4、5年前ですよね。

amuro_78
質問者

お礼

ありがとうござういます、。 resumeとUNIXについてはわかりましたが、 親プロセスと子プロセスの関係をもっと身近な例を出して説明してほしいです、

関連するQ&A

  • 子プロセスの利点

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

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

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

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

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

  • プロセスIDの取得方法 

    Unix C++でプロセスIDの取得方法を教えてください。 (見当違いの質問だったらすみません) 親プロセス(自分)のプロセスIDと、親プロセスの起動した子プロセスのプロセスIDを取得したいです。 また、親プロセスの起動した子プロセスのプロセスIDを使って親プロセス終了時に子プロセスをkillしたいと思うのですが、 具体的にどうすればいいかわからず困っています。

  • Apache(win32)での子プロセスについて

    PHPとは関係ないかもしれませんが、 適切なカテゴリーがなかったため、こちらに投稿しました。 現在、 Windows Server 2003 + Apache2.058 + php5.21  という環境でWEBシステムを開発していますが、 アクセスが増えてくるとApacheプロセスの使用メモリーが増大して メモリリークが発生してしまいます。 そこで、MaxRequestsPerChild を設定しますと、 リクエスト数でプロセスを再生成しますのでメモリは安定しますが、 再生成時にアクセスがあった場合に、不安定な動きをします。 (Terminating 17 threads that failed to exit.というerrorログを出力してApacheが動かなくる) そこで、お聞きしたいことが2点あります。 (1)アクセスが増えると使用メモリーは増大するものなのでしょうか? (2)MaxRequestsPerChildを設定した場合、子プロセス再生成時にアクセスがあった場合は、不安定になるものでしょうか? ご回答、対応策をご存知でしたら 教えていただけないでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • プロセスの生成(fork)

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

  • プロセスの生成

    #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ではないでしょうか? わかりにくい説明ですいません。 よろしくお願いします。

  • forkで作れる子プロセス数が限られている

    for($i=0;$i<1000;$i++) { if($p=fork) { next; } elsif(defined($p)) { sleep 10000; exit; } else { print("$i\n"); <STDIN>; } } 数十個で子プロセスが生成されなくなります メモリは十分あまってます デスクトップヒープ領域が足りなくなったわけじゃなさそうです どうすればメモリが足りる限り子プロセスを生成できるでしょうか? windows xp avtive perl 5.8.7です。

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

    こんにちは。 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 で「行数」のみ取得する(親プロセス)というものです。あくまで目標ですが・・。^^; お手数でしょうが、どうぞよろしくお願いします。

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

    ある本を読んでいると、以下のような問いにぶち当たり、プログラムの仕方がよくわからないのです。 自分でもいろいろ調べたのですが、わからないので質問させていただきます。 自分のプロセス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); }