
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.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が格納されました。
プロセスを作成するのは最初のプロセスだけですから。
長くなりました。
参考になれば嬉しいです。
No.2
- 回答日時:
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;
}
}
分かり易い例を書いて頂いてありがとうございます。
下記の様につくればよいのでしょうか?
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;
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 政治 私は文部科学省ヘ入り込んで投稿した私の建議文を彼らが私の依頼まましましょうか。? 2 2023/08/22 07:08
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 宗教学 キリスト教の聖書の教え方について、悩みがあるので、感想アドバイスなどよろしくお願いします。 『一足飛 28 2023/06/20 02:08
- 高校 極限公式 2 2022/12/08 02:17
- 環境学・エコロジー 二酸化炭素の排出 1 2023/08/07 16:40
- その他(教育・科学・学問) 「技術(テクノロジー)」と「工学(エンジニアリング)」の違いについて 5 2023/02/03 09:54
- 工学 PID制御 1 2022/07/27 11:50
- CPU・メモリ・マザーボード 今のCPUは2nmプロセスとか何やらで製造されているかと思いますが、このスケールをどんどん大きくして 3 2023/06/07 20:34
- 数学 論理 数学 ∃について 添付の問題がよくわかりません。 例えば1題目、∃xとあったらまず何を考えるの 3 2022/07/09 21:13
- 哲学 真実の信仰=真理の探究 1 2022/11/26 09:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
VB6.0 SHELLで起動...
-
怪しいプロセス教えてください。
-
共有メモリの同時アクセスにつ...
-
プロセスIDの取得方法について
-
フレームワークとプロセスの違...
-
実行中のプログラムIDが取得...
-
WSH.Runで待機できません
-
ActiveXでIEウインドウの最小化
-
vb.netでEXCEL起動がうまくでき...
-
共有メモリ方式とメッセージパ...
-
プロセスのアタッチ・デタッチ...
-
UNIX_Cにおける「名前つきパイ...
-
OSPFでプロセスを分ける意義に...
-
セマフォとmutexの違いは?
-
別のプロセスの関数を呼び出す...
-
特定ユーザーのプロセス情報を...
-
explorer.exeが異様にメモリを食う
-
非表示になったエクセルは?
-
他のアプリケーションをクリッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
怪しいプロセス教えてください。
-
sleep関数の精度について
-
【C#】別プロセスがロックか...
-
Process.Startの戻り値を後で取得
-
IISがフリーズ
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
Windowsでのfork方法
-
SendMessageが失敗するときがある
-
警告『 別のプロセスで使用され...
-
WSH.Runで待機できません
-
VB.NETで起動したExcelの閉じ方...
おすすめ情報