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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

4回答

828閲覧

forkから復帰ってどういう意味ですか?

VqFeCFRUL0U7zc6

総合スコア5

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/08/13 13:11

編集2020/08/13 14:24

forkから復帰とはどういう意味ですか?プロセス生成の説明にこの言葉が出てきたのですが、よくわかりません。
よろしくお願いいたします。
イメージ説明

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

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

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

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

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

otn

2020/08/13 13:39

普通はそういう表現は無いです。どういう文脈でしょうか?
VqFeCFRUL0U7zc6

2020/08/13 14:09

「まったく別のプロセスを新規生成する場合は、親となるプロセスからfork()を発行して、復帰後に子プロセスがexec()を呼ぶという、いわゆる「fork and exec」の流れになることが多いです。」 という感じで説明文が載っていました。 ソースは「試して理解 Linuxのしくみ」 武内 覚 著 です!
guest

回答4

0

質問で提示されている図中の「forkから復帰」とは、fork()を呼び出してからその呼び出しが終わった状態のことを指しています。下のコードの(1)としている場所です。
ちなみに同図の「即座にexec()を発行してechoを実行開始」は(2)としているexeclp()を実行した後の状態です。

C

1pid_t pid; 2int status; 3 4pid = fork(); 5/* (1) ここが「forkから復帰」した際の位置。*/ 6/* fork()によって2つになった親プロセスも子プロセスも両方共ここを通る。 */ 7if ( pid < 0 ) { 8 /* fork()に失敗した場合のエラー処理など */ 9} 10else if ( pid == 0 ) { 11 /* 子プロセスはここを通る */ 12 13 /* (2) 子プロセスを「echo」プロセスにする。execに成功するとここには帰ってこない。 */ 14 execlp( "echo", "echo", "hoge", NULL ); 15 /* execに失敗した場合のみここに来る。*/ 16 exit( 1 ); 17} 18 19/* 親プロセスはここを通る */ 20 21/* 子プロセス終了まで待つ */ 22wait( &status );

投稿2020/08/13 16:30

編集2020/08/13 16:53
hidezzz

総合スコア1248

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

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

0

ベストアンサー

forkした後、forkに関連して出来るのは、
・プロセスを終了する
・親プロセスが子プロセスの終了を待つ
だけなので、おそらくどちらかのことでしょうが、その人が「復帰」という言葉で何を言いたいのかは、本人に聞くか文脈から推測するしか無いです。

文字通りの意味だとすると、上記のどちらでもなくforkシステムコール自体からの復帰という意味になります。forkシステムコールから復帰した時点で、子プロセスが生成されていますので、自分が親か子かを判別して、それぞれその次の処理を行います。

#追記
図を見ましたが、上記後半の文字通りの意味でしたね。
プログラムが、プロセスの生成を行うfork関数(システムコール)を呼んで、OSカーネル内でプロセスの生成が行われてfork関数から戻ってきたらという意味です。

投稿2020/08/13 13:51

編集2020/08/13 15:09
otn

総合スコア84786

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

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

hana_yama_san

2020/08/13 14:12

あの、すいません。 fork実行後に自分のpidを取得して、 それにより次の処理を決めるというのは、 解りますが、 いきなりこの質問者さんに対して、 >>forkシステムコールから復帰した時点で、子プロセスが生成されていますので、自分が親か子かを判別して、それぞれその>>次の処理を行います。 って書いて理解してもらえると思っておられるのでしょうか。
otn

2020/08/13 15:10 編集

プロセスの生成とは何なのかが分かっていれば理解できると思います。 あえて判別の具体的な方法は出していません。
hana_yama_san

2020/08/13 15:50

プロセスの生成とは何なのか・・ それってシェルがファイルを参照し評価して、 カーネルを呼んで、メモリ上に実行ファイルを展開し、 展開された内容に基づき、テキストやヒープや スタックなどの各セグメントを(仮想メモリ上に)用意して、 ----------------------------------------------------------- また、命令を解釈して計算し、結果を出力・保存・加工 することですよね。 狭義で、点線以前 そんなこと質問者が解る訳ないでしょうに。
otn

2020/08/14 01:51

違いますよ。処理が枝分かれすることです。 不明点があれば、自分で質問を立てましょう。
guest

0

teratailの以前の質問(Linuxでの fork()について)
は理解の役にたちませんでしょうか。

投稿2020/08/13 13:25

ikapy

総合スコア1167

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

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

0

waitの事かなと。

投稿2020/08/13 13:15

hana_yama_san

総合スコア923

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

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

VqFeCFRUL0U7zc6

2020/08/13 13:20

おお!waitを調べたのですが、つまり、folkを発行しおわって次の処理に行けるよって状態がfolkからの復帰ということであってますか??
hana_yama_san

2020/08/13 13:37

子プロセスの状態変化を待って、それに応じた処置を親プロセスが 実施するための物です。 ※たいていは死んだ奴を引き取ると言う事になる。  これをしてやらないと子プロセスがゾンビになる。 出題者の意図する「forkから復帰」は微妙に多様に解釈出来そうですが、 ま、waitで引き取ってやるのがその意味に近いんじゃないかなと思いますね。
hana_yama_san

2020/08/13 14:40

質問を編集したようですが、forkとexecは違います。 execは自分のpidを別プロセスに引き継いで、 自分は居なくなります。(親子関係が無い) 実に迷う所で、以前私も苦労(と言う程でも無いか) しましたので、ご注意願います。
VqFeCFRUL0U7zc6

2020/08/13 14:52

ごめんなさい。無知で本当に申し訳ないのですが、私はが質問したforkからの復帰はexecと関係があったということですか??
hana_yama_san

2020/08/13 15:14

無いです。別物とは言わないまでも、 execしたら親プロセスは(親なのか)消滅・・ というか、プロセスIDが同じなので、 親プロセスの名前とメモリ上に展開された プログラムへの参照先が変更されるだけです。 ※例外も有ります。  exec実行者がsu(スイッチユーザ)した場合、  親子両方別プロセスとして存在します。  この場合平和裏に子プロセスが死ぬと、  親プロセスも同時に死んでくれます。 兎に角forkとexecはまったくの別物と 思っていた方が、幸せになれるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問