
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6.0 SHELLで起動...
-
怪しいプロセス教えてください。
-
VBでエクセルを起動し、プロ...
-
DLLにおいて、最後のプロセスデ...
-
タスクマネージャーのプロセス...
-
explorer.exeが異様にメモリを食う
-
sleep関数の精度について
-
vb.netでEXCEL起動がうまくでき...
-
ShellExecuteが起動したプロセ...
-
CPUの使用率について
-
ADOでアクセスのレコードに...
-
powershellでプロセスIDの変数化
-
Macターミナルで実行中のプログ...
-
家電製品の電力周波数を変える機械
-
64BitOSについて
-
TCP/IP通信時のサーバーからの受信
-
C# シリアル通信でデータ受信...
-
socket: recvはいつ,どれだけ...
-
メモリが不足しています(VBA)
-
VB6で10進数を32進数に変換する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
C#でのbatファイル実行結果取得
-
Process.Startの戻り値を後で取得
-
タスクマネージャーのプロセス...
-
SendMessageが失敗するときがある
-
VB6.0 SHELLで起動...
-
Linuxでのスレッド間メッセージ...
-
vb.netでEXCEL起動がうまくでき...
-
explorer.exeが異様にメモリを食う
-
プロセスIDの取得方法について
-
IISがフリーズ
-
jdbcのプロセスの処理について
-
c言語でプロセスIDを調べたい
-
セマフォとmutexの違いは?
-
警告『 別のプロセスで使用され...
-
ADOでアクセスのレコードに...
-
OSPFでプロセスを分ける意義に...
-
Windowsでのfork方法
おすすめ情報