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

このQ&Aに関連する最新のQ&A

A 回答 (3件)

下記のお答え。


んんんと、それだと最後に作成されたプロセスで、forkの戻り値が0なので、ifを通らないままforを抜けて、何もしないプロセスになってしまうような・・・。

for(n = 0; n < 2; n++){
if(pid[n] = fork) break;
}

switch(n){
case文で0~3 (←3までであることに注意)
}

とすると、forループを抜けた時点で、

(1) nに0が入っている、親プロセス
(2) nに1が入っている、(1)プロセスに作られた子プロセス
(3) nに2が入っている、(2)プロセスに作られた子プロセス
(4) nに3が入っている、(3)プロセスに作られた子プロセス

ができます。
どういう経緯をたどるかというと、

(1) 親プロセスはn=0をセットし、forkの戻り値にIDが入るのでブレーク、forを抜けたあとのnは0。
(2) n=0のループでforkを呼び出した時点でプロセスが複製され、forkの戻り値が0なので、ブレークせずにnがインクリメントされn=1に。そしてforkを呼び出し、プロセスIDが返り、真なのでブレーク、forを抜けたあとのnが1。
(3) n=1のループでforkを呼び出した時点でプロセスが複製され、forkの戻り値が0なので、ブレークせずにnがインクリメントされn=2に。そしてforkを呼び出し、プロセスIDが返り、真なのでブレーク、forを抜けたあとのnが2。
(4) n=2のループでforkを呼び出した時点でプロセスが複製され、forkの戻り値が0なので、ブレークせずにnがインクリメントされn=3に。そしてn>2なのでループを抜け、forを抜けたあとのnが3。

というわけでforを抜けたあとswitchで判別するといいと思います。
これは自分でやったことであり、参考書とかを見たわけではないので、これが一番正しいとは言えないのですが、動作はしました、perl上ですが(笑)。
でもどの言語でも同じだと思います。

ちなみにperlではpid[n]には、あとのプロセスのIDは格納されません。
たとえばn=0のプロセスではpid[1]は入っていませんでした。
どうやら、複製されたプロセスで、変数は共有されていないようです。
もちろん、この部文はほかの言語でどうなるかわかりませんが。

if(!(pid[n]) = fork()) break;
とすると、いちばん最初のプロセス(n=0)だけのpid[n]にすべてのプロセスIDが格納されました。
プロセスを作成するのは最初のプロセスだけですから。

長くなりました。
参考になれば嬉しいです。
    • good
    • 0
この回答へのお礼

大変参考になりました。詳しく教えて頂いてありがとうございました。

お礼日時:2002/01/21 21:03

forkはこれを呼び出した時点で、そのプログラムのメモリ内容をすべてコピーしたプロセスの複製を作ります。


ただし、1つだけ違う個所があります。
それはforkの戻り値です。

間違えやすい例を。

fork();
fork();

1個目のforkで2つのプロセスに別れ、その2つが2個目のforkを呼び出すので結果4つできてしまう。

for(n = 0; n < 2; n++){
if(fork()) break;
}

というふうにやると、子プロセスが2つできます。
ちなみに、Cの質問なのかシェルスクリプトの質問なのかわからなかったので、言語は適当です。
適当に解釈してください。

この回答への補足

分かり易い例を書いて頂いてありがとうございます。
下記の様につくればよいのでしょうか?
pid_t pid[2];
for(n=0;n<2;n++){
if(pid[n] = fork()){
switch(n){
case 0:
処理A(system("他に作成したプログラム")等)
      break;
case 1:
処理B
      break;
default:
break;
}
break;
}
}

補足日時:2002/01/16 19:55
    • good
    • 0
この回答へのお礼

分かり易い例を書いて頂いてありがとうございます。
下記の様につくればよいのでしょうか?
pid_t pid[2];
for(n=0;n<2;n++){
if(pid[n] = fork()){
switch(n){
case 0:
処理A(system("他に作成したプログラム")等)
   break;
case 1:
処理B
   break;
default:
break;
}
break;
}
}

お礼日時:2002/01/17 15:14

必要な個数分、fork()を繰り返して呼び出せばよいと思うのですが、


それではいけませんか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ちょっと試してみます。

お礼日時:2002/01/16 20:05

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qツムツムの海賊のお宝探しのミッションで1プレイでツム1000コ消そうが、どうしてもクリアできません。

ツムツムの海賊のお宝探しのミッションで1プレイでツム1000コ消そうが、どうしてもクリアできません。みなさんは、何のツムで、クリアしましたか?

Aベストアンサー

野獣・ピート・スカー・トリトン王等の30以上消去するツム(要高lv)
を5→4・Time・ボムアイテムを使用してプレイするのがよくあるやり方かと。
高lvツムが無いならオズワルドでボムキャンを駆使して頑張るという手もアリ。
一番簡単なのはデイヴィジョーンズを引いて使うことかもしれないので、持っているなら
割とおすすめかもしれません。ボーナスで1.5倍になるので。
とにかくフルアイテムが基本です。

Qfork()で作られた子プロセスから親プロセスの生存を知る方法は?

タイトルの通りなのですが、プロセスAから
fork()で子プロセスBを作り、Bには無限ループで処理をさせます。
Aはユーザからの入力を受け、処理を行います。
Aが終了要求をされプロセスを終了するときに、
Bも同時に終了したいのですが、BからAの生存を判定して
Aのプロセスが切れていたBも終了する、ということは可能でしょうか?
Bの無限ループ処理では、ファイルの書き換えを行っているので
AからBのPIDを指定してKillする、ということはせずに
B自身で判定して終了するようにしたいのですが。。

Aベストアンサー

>その場合、子プロセスはゾンビプロセスとなってしまいますか?

なりません。initは、子プロセスが終了すると、waitを呼び出して、子プロセスが、ゾンビになることを防止します。

Qツムツムについての質問です スキルMAXのツムだと何のツムが一番 コインを稼げますか?あと 一番スコ

ツムツムについての質問です
スキルMAXのツムだと何のツムが一番
コインを稼げますか?あと
一番スコアが伸びるものも教えてください

Aベストアンサー

どうも初めまして(*^o^*)高得点を出せるツムが知りたいのでしたら、このサイトを見てみてください!URL貼っときますね⭐︎ ちなみに、無料でゲットとか言う広告は嘘なので無視してくださいね。
http://www.afroasian2012.org/ruby356.html
そして、コインですね!

http://www.afroasian2012.org/ruby354.html

URLで本当にごめんなさい...説明しにくくて...参考になれば嬉しいです⭐︎

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

Linuxの学んでいる者です。

表題の件について、本を読んだり、ネットで検索したり
したのですが、解決ができなかったため質問させて
いただきました。

以下に例を挙げます。

1つのCファイルに、「main」と「A」と「B」という関数があるとします。

「main」関数にて、fork()で2つプロセスを生成し、一方のプロセスでは
「A」関数を実行し、もう一方では「B」という関数を実行させます。

「A」という関数は3秒ごとに「1,2,3,…」と数字を出力するもので、
「B」という関数は5秒ごとに「10、20、30、…」と数字を出力するものとします。

こういう場合に、プロセスに「A」や「B」の処理を実行させることができません。

exec関数でプロセスに別のプログラムを実行させることはできますが、
プログラムの実行ファイルのパスを指定して実行させるようなので、
この場合にはうまく使えません。

理解されている方には、本当に些細なことではあると思いますが、
私では解決にまで至らなかったので、ご教授いただければ幸いです。

よろしくお願いいたします。

Linuxの学んでいる者です。

表題の件について、本を読んだり、ネットで検索したり
したのですが、解決ができなかったため質問させて
いただきました。

以下に例を挙げます。

1つのCファイルに、「main」と「A」と「B」という関数があるとします。

「main」関数にて、fork()で2つプロセスを生成し、一方のプロセスでは
「A」関数を実行し、もう一方では「B」という関数を実行させます。

「A」という関数は3秒ごとに「1,2,3,…」と数字を出力するもので、
「B」という関数は5秒ごとに「10、20、30、…」と数字を...続きを読む

Aベストアンサー

単にfork()して子プロセスから呼べばいいです。

if( !(child_a = fork()) ){
A();
exit(0);
}
if( !(child_b = fork()) ){
B();
exit(0);
}
とか。

Qツムツムで耳の丸いツムで沢山コンボするには、どのツムを使うのがおすすめですか?

ツムツムで耳の丸いツムで沢山コンボするには、どのツムを使うのがおすすめですか?

Aベストアンサー

私は白雪姫でやりました。スキルでタップし、ボムがたくさん出るので、かなりコンポが稼げます。スキル4でいけましたよ。
ミニー姫なんかもよさそうですね。スキル発動し、小刻みに3つずつくらいにつなげば。
あと、マッドハッターなんかもよさそうですが、耳が丸いかどうか調べてないのでごめんなさい。
 頑張ってくださいね。

Q子プロセスと親プロセス

ある本を読んでいると、以下のような問いにぶち当たり、プログラムの仕方がよくわからないのです。
自分でもいろいろ調べたのですが、わからないので質問させていただきます。

自分のプロセス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);
}

ある本を読んでいると、以下のような問いにぶち当たり、プログラムの仕方がよくわからないのです。
自分でもいろいろ調べたのですが、わからないので質問させていただきます。

自分のプロセスIDと親のプロセスIDのプロセスIDを表示するコマンドshowpidを作り、showpidを子プロセスとして10回実行するプログラムを作りなさい。ただし、execを用いてshowpidを10回実行すること。

というものなのですが、自分のプロセスIDと親のプロセスIDの表示方法はわかったのですが、それをコマンドとして作り、子プロセス...続きを読む

Aベストアンサー

showpid.c では単に、getpid() と getppid() の結果を出すだけでいいです。それをコンパイルすればコマンドが出来ます。

メインのプログラムでは、こんな感じで。
for(10回ループ) if(fork()==0) execv(showpidコマンド)

Qツムツムのシンデレラのイベントは何のツムでやっていますか?

ツムツムのシンデレラのイベントは何のツムでやっていますか?

Aベストアンサー

とんすけです。
確実なので。

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

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

Aベストアンサー

質問に「cpコマンドを実現したい」と書かれているのは、もしかしてcdコマンドの書き間違いでしょうか。そう考えると、なぜ親プロセスのカレントディレクトリを移動したいのかが納得できます。
この推測が合っていたとして、普通はcdコマンドのために子プロセスを作ることはしません。cdはシェルのビルトインコマンドとして実現されているのが一般的です。

Q「ブドウ糖(3っつの部分)」←これはどういう意味?

当方、化学にはまったくの素人なのですが、化学関係の翻訳を頼まれました。いろいろ調べながら訳しているのですが、壁にぶつかりまして、御教授いただければ幸いです。
原文は英語ではないため、直訳風の私の試訳を載せます。

「○○○のタンパクは2.2%の糖分が含まれ、それは基本的にブドウ糖(3っつの部分)と果糖(8っつの部分)の混合物である。***のタンパクは2.8%の糖分を含み、それはブドウ糖が4っつの部分、果糖が1つの部分である」

この私訳の“3っつの部分”とか“8っつの部分”とかは、英語にすればそのまま three parts とか eight parts ということになるのですが、どういう意味なのか分かりません。
どういうことなのか、あるいは、どういうことを調べれば解るのか教えていただければ幸いです。

Aベストアンサー

 タンパク名だと想ったので、糖タンパクであり、糖はタンパクに結合している、と解釈しました。が、単に割合を述べただけのようで、化学的な結合に論及していないようです。
 ○○○がタンパク名なら、糖との結合、その順序が重要ですので、論じるのが普通だと先走りしてしまいました。

>「ロブスターのタンパクは2.2%の糖分が含まれ、それは基本的にブドウ糖(3っつの部分)と果糖(8っつの部分)の混合物である。カニのタンパクは2.8%の糖分を含み、それはブドウ糖が4っつの部分、果糖が1つの部分である」

 直訳だと、「ロブスターのタンパクは2.2%の糖分が含まれ、それは基本的にブドウ糖3部と果8部の混合物である。カニのタンパクは2.8%の糖分を含み、それはブドウ糖が4部、果糖1部である」と訳しました。
 部は、英語ではpartでしょうが、日本語ではpartは省略、上の訳でも、部を削除した方が良い。

 意訳だと、「「ロブスターのタンパクは2.2%の糖分を含み、糖分は基本的にブドウ糖3、果糖8の組成比の混合物である。カニのタンパクは2.8%の糖分を含み、それはブドウ糖4、果糖1の組成比である」と、組成比という単語を加えれば分かりやすいのでは。

 英語で論文を書くときは、実験結果などは、客観性を強調するために受動態の過去形で書きます。既知の事実や著者の主張などは、現在形で表現します。英語の記述は受動態が一般的ですが、和訳は能動態の方が分かりやすいかと。ただ、これは統一する必要があります。
 単数・複数や前置詞などは、審査員から訂正されて返ってきますので、ご参考まで。

 タンパク名だと想ったので、糖タンパクであり、糖はタンパクに結合している、と解釈しました。が、単に割合を述べただけのようで、化学的な結合に論及していないようです。
 ○○○がタンパク名なら、糖との結合、その順序が重要ですので、論じるのが普通だと先走りしてしまいました。

>「ロブスターのタンパクは2.2%の糖分が含まれ、それは基本的にブドウ糖(3っつの部分)と果糖(8っつの部分)の混合物である。カニのタンパクは2.8%の糖分を含み、それはブドウ糖が4っつの部分、果糖が1つの部分である」...続きを読む

Qpopenした子プロセスのプロセスIDを知る方法は?

タイトルのとおりです。
popen後のPIDを管理したいのですが
PIDを知る方法がわかりません。

どうしたらよいか教えてください。

Aベストアンサー

popenの仕様上、子プロセスのPIDを呼び出し元が知る方法は標準では用意されていません。

したがって、解決方法としては、ソースをコピーしてpopenのスーパーセットを用意するのが一番簡単です。

FreeBSDの/usr/src/libc/gen/popen.cの実装では、関数でstaticにポインタを確保していて、popenが呼び出されるたびにとpidとfpを保存するメモリの一次リンクが保持されています。

この場合、staticのポインタのリストの内容を取り出せる関数をひとつ実装するだけで、pidは取り出せます。
実装とはいっても、pcloseではwait4を実行するためにリストの内容をたぐるコードが入っているので、そこをコピペするだけです。

いかがでしょうか。


人気Q&Aランキング

おすすめ情報