【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22788

ファイルの書き込み処理について
投稿者---mongoru(2005/08/23 19:24:14)


ファイルの書き込み処理について詳しく知りたいので、質問さ
せて頂きます。
環境は、RedHat8.0です、宜しくお願いします。

同じファイルに複数のファイルポインタを使用し、書き込む際
どういった問題が発生するかご存知の方、ご教授下さい。
 なお、書き込み直後は、fflushするものとします。


ファイル書き込み時の状況は、いろいろあると思いますが、
例えばマルチスレッド時ではどうなるかなどいろいろな情報を
教えて頂けるとうれしいです。


宜しくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルの書き込み処理について 22791 あかま 2005/08/23 23:33:16


No.22791

Re:ファイルの書き込み処理について
投稿者---あかま(2005/08/23 23:33:16)


自分で実験して確かめない理由は?
データ取らないとレポートって書けなくないです?
レポートかどうかしらないけど。


基本的に排他制御しない限りは、同時にオープンできるんで同時に書き込みも可能です。
そうするとどうなるかは、大体想像でわかるかと。

書き込んでfflushの直前でタスクが切り替わっちゃった時。またその対策などを想定すると面白いかもしれません。



この投稿にコメントする

削除パスワード

No.22792

Re:ファイルの書き込み処理について
投稿者---mongoru(2005/08/24 09:43:23)


あかまさん
ご解答有難うございました。

学校のレポートではありませんのでご安心下さい。
fopen,open関数などを最近使用し、気になっていたので質問さ
せて頂きました。

書き込み後とfflushの直後もしくは排他制御をしない限り、特に
問題ないということですね。


再度質問で申し訳ありませんが、書き込み後とfflushの直後で
発生するケースというのをもう少し詳しく教えて頂ければ有難
いです。

こういった状況とはまれなケースなのでしょうか?


度々、申し訳ありませんが宜しくお願いします。


この投稿にコメントする

削除パスワード

No.22793

Re:ファイルの書き込み処理について
投稿者---REE(2005/08/24 10:11:37)


>書き込み後とfflushの直後もしくは排他制御をしない限り、特に
>問題ないということですね。

あかまさんの発言からどうしてこの様な解釈が?

>再度質問で申し訳ありませんが、書き込み後とfflushの直後で
>発生するケースというのをもう少し詳しく教えて頂ければ有難
>いです。

ご自身で実験して下さい。
こういう疑問があるときに、自分で実験するのが一番学習効果があります。
実験した上で、どうしてそのような結果になるのか分からない場合に、改めて質問するといいでしょう。



この投稿にコメントする

削除パスワード

No.22796

Re:ファイルの書き込み処理について
投稿者---あかま(2005/08/24 19:06:22)


REEさんの仰る通りあとは実験して確かめてほしいのですが、
すこし勘違いされているようなのでそこだけ説明しますね。

>書き込み後とfflushの直後もしくは排他制御をしない限り、特に
>問題ないということですね。
>
>再度質問で申し訳ありませんが、書き込み後とfflushの直後で
>発生するケースというのをもう少し詳しく教えて頂ければ有難
>いです。
fflushの「直後」ではなく「直前」です。


A.print
↓
A.fflush
↓(タスク切り替え)
B.print
↓
B.fflush

なら書き込んだ順(printの順)にファイルに反映されるので問題ないですが、
もしA.fflushの直前でタスクが切り替わったとき

A.print
↓(タスク切り替え)
B.print
↓
B.fflush
↓(タスク切り替え)
A.fflush

となって意図した順に書き込まれないかも。
ということです。

Aが一連の処理をしている間、Bの書き込みをストップさせたり、
同時に同じファイルを開かないようにしたりすることを「排他制御」といいます。
ですので必要なら排他制御はしたほうがいいです。

>こういった状況とはまれなケースなのでしょうか?
まれであろうとなかろうと潜在的に意図しない動作をすることがあるならバグですので対策を考慮しなくてはいけません。
マルチスレッドなどで同時にデータを共有するときは必須だと思います。



この投稿にコメントする

削除パスワード

No.22805

Re:ファイルの書き込み処理について
投稿者---mongoru(2005/08/25 10:09:36)


あかまさん
有難うございました。

ご丁寧な説明で理解することができました。

>A.print
>↓
>A.fflush
>↓(タスク切り替え)
>B.print
>↓
>B.fflush

>なら書き込んだ順(printの順)にファイルに反映されるので問題ないですが、
>もしA.fflushの直前でタスクが切り替わったとき

>A.print
>↓(タスク切り替え)
>B.print
>↓
>B.fflush
>↓(タスク切り替え)
>A.fflush

>となって意図した順に書き込まれないかも。
>ということです。


上記のような異常が発生した場合、A.print後にA.fflushしたい
のにタスクの切り替えが発生し、A.fflushする前に
B.print⇒B.flushの処理がされ、その後、A.fflushされるので、
ファイルに書き込まれた内容は、

A.printの内容
B.printの内容

を期待しているのに、

B.printの内容
A.printの内容

となるわけですね。そこで排他制御を行なう必要があるわけですね。

プログラム上でこのようなことを発生させる実験をするにはどのよ
うなことを行なえば宜しいでしょうか(タスクの切り替え処理をど
のように起こせば良いでしょうか?)?

もしよければ、ご教授下さい。
宜しくお願いします。


この投稿にコメントする

削除パスワード

No.22809

Re:ファイルの書き込み処理について
投稿者---あかま(2005/08/25 21:05:56)


>(タスクの切り替え処理をどのように起こせば良いでしょうか?)?
マルチタスクOSなら、複数のタスクを起動したときにOSが勝手に切り替えます。
自分で行う必要はありません。
逆に切り替わるタイミングを計るのが難しいので、
挙動がおかしくなるであろうプログラムもそれを出現させるのは難しいかもしれません。

次のプログラムをひたすら実行してみてください。
たまーに入力と出力の整合性がとれなくなるはずです。
そしてそれがなぜ起こるか考えてみてください。


#include <stdio.h>

int main(){
    int i,j,v;
    
    if(fork()){//子プロセスの起動
        for(i=0;i < 2;i++){
            printf("parent ?");//この行が実行されて、scanfに行く前にタスクが切り替わるとどうなるか?
            scanf("%d",&j);
            printf("parent:%d\n",j);
        }
        wait(&v);
    }
    else{
        for(i=0;i < 2;i++){
            printf("child ?");
            scanf("%d",&j);
            printf("child:%d\n",j);
        }
    }
    return 0;
}




この投稿にコメントする

削除パスワード

No.22810

Re:ファイルの書き込み処理について
投稿者---あかま(2005/08/25 21:18:29)


よく考えたらプログラムがもはやファイル入力じゃなくなってた。
マルチプロセスには気をつけてということで。


この投稿にコメントする

削除パスワード

No.22817

Re:ファイルの書き込み処理について
投稿者---mongoru(2005/08/26 09:45:53)


>よく考えたらプログラムがもはやファイル入力じゃなくなってた。
>マルチプロセスには気をつけてということで。

あかまさん
サンプルプログラムを書いて頂き、有難うございました。
今回の件で、いろいろ勉強させて頂きました。


今後、このような問題に直面した際に、いろいろ実験したい
と思ってます。

お付き合い頂き、有難うございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧