質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

552閲覧

c言語でfork関数がプロセスされる手順を知りたい

ijuya_yika

総合スコア50

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/11/07 13:53

編集2017/11/07 13:58

###前提・実現したいこと
fork関数がプロセスされる手順を知りたくて以下のコードを書いてみた所、実行毎によって同じではないことがわかったのですがそれはなぜなのでしょうか

###該当のソースコード

C

1#include <unistd.h> 2#include <stdio.h> 3 4void forking(){ 5 6 int p_id; 7 printf("0\n"); 8 p_id = fork(); 9 10 printf("p_id at line 10 is %d\n", p_id); 11 if (p_id != 0) { 12 printf("1\n"); 13 p_id = fork(); 14 15 printf("p_id at line 15 is %d\n", p_id); 16 if (p_id == 0) { 17 printf("2\n"); 18 } 19 } 20 printf("p_id at line 20 is %d\n", p_id); 21 printf("Sayonara\n"); 22 23} 24 25int main(int argc, const char * argv[]) { 26 forking(); 27 return 0; 28}

実行結果1回目

text

10 2p_id at line 10 is 16700 31 4p_id at line 15 is 16701 5p_id at line 20 is 16701 6Sayonara 7p_id at line 10 is 0 8p_id at line 20 is 0 9Sayonara 10p_id at line 15 is 0 112 12p_id at line 20 is 0 13Sayonara

実行結果2回目

text

10 2p_id at line 10 is 16705 31 4p_id at line 10 is 0 5p_id at line 20 is 0 6Sayonara 7p_id at line 15 is 0 82 9p_id at line 20 is 0 10Sayonara 11p_id at line 15 is 16706 12p_id at line 20 is 16706 13Sayonara

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

fork()関数を呼び出した場合、そのまま親プロセスが実行されるか、
子プロセスが先に実行されるかは、分かりせん。
ある意味「運」です。
おそらく、それまでに各プロセスに割り当てた時間によって、結果が
異なっていると思います。

そもそも、マルチプロセスの場合で、動ける状態にあるプロセス同志は、
どちらが先に実行されるかは分かりません。
ある意味、OSのみが知る世界です。

マルチプロセスであるのに、作った側の意図通りの順番で処理を動かし
たいのであれば、シングルプロセスで作った方が簡単ですし、余計な
問題も生まれません。

マルチプロセスだけれども、順番を制御したい部分がどうしてもあると
いう事ならば、同期リソースを使って制御する必要があります。

投稿2017/11/07 14:28

ShinyaAnan

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ijuya_yika

2017/11/07 20:52

ご回答ありがとうございます。 なるほど、fork関数が呼ばれた順番にプロセスがされるというわけではないのですね。 ということは以上のコードの場合の出力は、親のフローのときに、「0➝1➝sayonara」と「1➝sayonara」、子の場合のフローは「2➝sayonara」となり、プログラム全体の出力は以上3つのフローのトポロジカルソートであればなんでも良いということでしょうかね?
ShinyaAnan

2017/11/08 13:35

実際、最近では、のマルチコア、マルチスレッドのCPUパソコンでも珍しくありません。 その場合、処理自体も本当に同時に実行される場合も当然あります。 シングルコア、シングルスレッドのCPUであれば、3通りという話もできますが、最近では稀では? マルチコア、マルチスレッドCPUの場合、同時に処理が走っり、ただ、 printf() 最初に呼び出したプロセスから順番に表示されているだけだと考える 方が正解です。 実行されている環境で、複数のプロセスの表示が混ざらないのは、おそらく、 printf() 関数が、セマフォなどを使い、排他制御を行っているのでしょう。 printf() のが排他制御を行っていない環境では、複数のプロセスが同時に、 表示すると、1文字ずつ交互に事もありましたよ。
ijuya_yika

2017/11/08 20:21

排他制御なんてあるんですね。確かに自分の環境だと出力は"0","1","sayonara"で混ざらないので仰る通りなのだと思います。 ご回答ありがとうございました。
guest

0

forkシステムコールの仕様をリファレンスでよく確認することをお勧めします。

fork()すると子供プロセスが生成され「form()呼び出し直後以降のコードが」親プロセスと子プロセスで並行して動作を継続します。そこがform()のポイントです。

親プロセスではformの戻り値が子供プロセスのプロセスidになり、子供プロセスでは0になります。子供プロセスは自分の親プロセスを別途知ることができるのでform()の戻り値で「自分が子供プロセスとして動き出した」ことが分かった方が都合がよい・・・といったことがリファレンスをよく読めばわかってくるはずです。

投稿2017/11/07 14:32

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ijuya_yika

2017/11/07 22:09

ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問