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

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

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

排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

Ruby

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

Q&A

1回答

1530閲覧

rubyでファイルに追記する際の挙動(追記しか行われない場合は排他制御なしでも大丈夫か?)

domidomi

総合スコア34

排他制御

排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

Ruby

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

0グッド

0クリップ

投稿2018/08/31 05:26

##疑問

**1、**rubyでファイルに追記する際、「読み取り」+「書き込み」が行われているのか、それとも「書き込み」のみが行われているのか?
**2、**もし「読み取り」+「書き込み」が行われている場合、「読み取り」のタイミングはファイルをクローズする瞬間なのか?
**3、**もし「読み取り」が発生してない場合は追記する際コンピュータはどういう判断で書き込む場所を理解しているのか?(ファイルのサイズを見て最後の場所に入れ込む?)
**4、**一つのファイルに対して同時かつ大量に追記が起きる場合でも排他制御はいれなくてもよいのか?

##背景

rubyでファイルに追記する場合は「読み取り+書き込み」が行われていると思い、以下の内容の実行ファイルを二つつくり排他制御有り無しでいろいろ実験してみました。

ruby

1File.open('/home/vagrant/tekitou/zikkenyou', 'a')do |f| 2 f.flock(File::LOCK_EX) #占有ロック(排他制御) 3 a = gets 4 f.write(a) 5end

イメージ説明
(画像はただの実験の様子)

排他制御ありだと待ち状態は発生しましたが、何を試しても古い状態に対してアップデートを行うという問題(用語を忘れました)は起きなかったです。

つまり書き込む瞬間に書き込むべき最後の行をコンピュータが理解しているのだろうと思いましたが確証はまったくもてずにいます。

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

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

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

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

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

guest

回答1

0

OS依存の可能性がありますが、Unix/Linuxだとシステムコールのファイルオープンに追加書きモードがあります。
その場合は、毎回の書き込みシステムコールでは実際の書き込みの前に、書き込み位置がその時点のファイル末尾に位置付けられます。
位置づけし直しと書き込みはアトミックに行われると言う事なので、追加書きをしている限りに置いては、排他制御は不要に思えます。

参考:man 2 write

投稿2018/08/31 06:24

otn

総合スコア84503

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問