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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Q&A

解決済

1回答

298閲覧

プロセスについて解説されたサイトで見つけた条件分岐についての解釈

domidomi

総合スコア34

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

0グッド

0クリップ

投稿2018/03/20 01:13

##疑問
・if pid.nil?はforkされた親プロセスでも子プロセスでも満たされないと考えているが、実際には子プロセスでは満たされている。その理由は何故か?

##詳細
https://github.com/Shinpeim/process-book/blob/master/004.md
githubに上がっているlinux系OSのプロセスについてとても分かりやすく解説してある記述を見つけて読んでいました。
その中に以下のコードがありました。

ruby

1# -*- coding: utf-8 -*- 2file = File.open("nyan.txt","r") 3 4# ファイルをopenしてからforkする 5 6pid = Process.fork 7 8if pid.nil? 9 #子プロセス 10 sleep 1 # 親プロセスがfileを閉じるのを待つ 11 12 # 親プロセスがfdを閉じてても、自分はまだ番号札を持ってるから読み込める 13 puts file.readlines.join 14 15 file.close #自分も番号札を返す 16else 17 # 親プロセス 18 file.close #番号札をOSに返す 19 Process.wait(pid) #子プロセスが終わるの待つ 20end

こちらのコードのif pid.nil?子プロセスというコメント記述があり、実際に走らせた場合の子プロセスのみ実行される内容が書いてあります。

しかし自分の解釈では、pid = Process.forkとforkされた瞬間に、子プロセスもpid = Process.forkまで読み終えた状態の親プロセスとまったく同様なメモリの状態を保持していると考えています。

その為、子プロセスにおいてもpidnilではなく(自分のpid変数pidには入っている)、elseの処理が走ってしまう(親プロセス子プロセスelseの処理が走る)と考えてしまいます。

しかし実際には子プロセス親プロセスは違う処理が走っています。
この考えの間違えている部分はどこなのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

しかし自分の解釈では、pid = Process.forkとforkされた瞬間に、子プロセスもpid = Process.forkまで読み終えた状態の親プロセスとまったく同様なメモリの状態を保持していると考えています。

正確にはProcess.forkの瞬間を複製し、forkの戻り値

親プロセスでは子プロセスのプロセスIDを、子プロセスでは nil を返します。

となっています。

投稿2018/03/20 02:20

編集2018/03/20 02:21
asm

総合スコア15147

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

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

domidomi

2018/03/20 02:31

ありがとうございます。 forkにも戻り値があることが抜けていたようです。簡単な質問にも答えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問