プログラムの終了時に、確実にデータをファイルに書き出したいと思っています。
以下の場合の中で、終了処理のコードが実行されない、あるいは書き込みバッファやファイルシステムのキャッシュがフラッシュされない、等の理由で、ファイルへの書き出しが失敗する可能性があるのはどれでしょうか?
失敗する理由や、対処法も教えていただければ幸いです。
また、他にも注意すべきケースはありますでしょうか?
1.(ユーザによって)タスクマネージャから強制終了された時
2.「応答がありません」になってから(ユーザによって)強制終了された時
3.Windowsシャットダウン時に(OSによって)強制終了された時
4.何のエラーメッセージも表示されず、突然終了した時 (たまにこういうアプリありますよね?)
5.ブルースクリーンになった時
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
>1.(ユーザによって)タスクマネージャから強制終了された時
アプリケーションの終了処理は走りません。(WM_DESTROY時の処理、デストラクタ、コールスタックの巻き戻しは走りません)
>2.「応答がありません」になってから(ユーザによって)強制終了された時
アプリケーションのバグの可能性が高いです。ビジーループでそうなります。
※マルチスレッドだった場合他のスレッドが生きていて処理を続行している事はあります。
>3.Windowsシャットダウン時に(OSによって)強制終了された時
応答がある場合は正常な終了処理が行われますが
応答が返ってこない等の理由で強制終了した場合は終了処理は走りません。(1と同じ)
>4.何のエラーメッセージも表示されず、突然終了した時
「不正な処理を行ったため強制終了・・・」と表示される場合はバグの可能性が高いです。
例えば不正なメモリーアクセスで発生します。
>(たまにこういうアプリありますよね?)
※何も言わずに内部的には正常終了した可能性があります。
>5.ブルースクリーンになった時
メモリー破損等のハードウェアの欠損かドライバのバグで発生します。
アプリケーションレベルではないです。
どの部分の終了処理の事をいっているのかによりますが
アプリケーションの終了処理は全てにおいて実行されません。
※1、2、3、4は意図的に再現させることが可能なので試してみるとよいでしょう。
基本的にはこまめにフラッシュする事とバグの原因を追究し潰していくしかないと思います。
詳しい回答ありがとうございます。
try-catchとatexitで実験してみたら、両方とも強制終了では終了処理のコードは実行されませんでした。(atexitに関しては、マニュアルよく読んだら”正常終了時”って書いてあったので当然ですね)
とても勉強になりました。
アプリのバグを潰して、処理可能なエラーしか発生させないように作るのが大切なんですね。
No.3
- 回答日時:
最大の違いは「OSがアプリに終了してほしいと要求を(まず)出す」のが1/3で「アプリがどうしようもなくなっていると判断されるのでOSが勝手に落とす」のが2/4、ということです。
つまり1/3は「OSがアプリを終了させようとしている」ことがアプリ自身に判断できる材料がありますが、2/4にはない訳です。
No.2
- 回答日時:
「アプリケーションの終了処理以外の要因により終了した」ケースは全て失敗する可能性があります、というか終了処理内でのみファイルクローズなどを実施している場合はほぼ確実に失敗します。
そのようなケースの場合、2/4/5では失敗します。
これらはアプリが終了処理に入れずに終了してしまうパターンです。
2と4についてはアプリ自身に問題があるため、原因を解消するのが先。
5はOS側異常であるため、それをアプリが引き起こしたのでない限りどうしようもありません。
1と3については、まずOSから終了通知メッセージが送られるため、それを適切に処理できれば問題ありません。
ですが、処理できない場合には2のケースと同様になります。
可能な限り被害を抑える方法としては、「ファイルを開きっぱなしにしておかない」という処理が考えられます。
書き込み内容のHDDへの適用タイミングは基本的にOS次第ですが、例外としてファイルクローズ時には必ず適用されます。
ですから、こまめにファイルを閉じることで常にHDDに内容が書かれた状態を保つ、ということになります。
回答ありがとうございます。
こまめにフラッシュしてディスクに書き出すのは大事ですね。
ひとつ疑問なのですが、2と4で終了処理のコードが実行されないのはどうしてなのでしょうか?
2と4の場合と、キャッチ可能なエラーが発生した場合(終了処理のコードが実行される場合)では、どのような違いがあるのでしょうか?
No.1
- 回答日時:
ファイルに対して書き込みを行っていれば、OSはデータ書き込みを受け付けた状態に
なっているので、OSが異常状態の、5.ブルースクリーンになった時以外は、
ファイルへの書き出しは保証されるはずです。
5.が発生したときには、データがどこまで書かれているか、というと、それはわかりません。
対策としては、プログラム起動時に、データが破損しているかどうかをチェックして、
破損していたら復旧処理を入れるとか、復元ポイントのようなものを用意しておいて、
ある時点の状態に戻すぐらいだと思います。
プログラムの終了日時を終了日時記録ファイルに記録するような機構を設けておいて、
データファイルの更新日が終了日時記録ファイルより新しければ、
アプリが正常終了しなかったと判断するとかね。
回答ありがとうございます。
5のケースは、たぶんダメだろうと予想してましたが、その通りみたいですね。
更新日時のチェックで正常終了を判断するのは有効な手段ですね。
検討してみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- iPhone(アイフォーン) 容量は半分以上あるのにアプリが強制終了する理由はなんですか? CPUがどのような状態なのでしょうか? 8 2023/08/27 00:50
- Windows 7 Media Playerが開かない。ファイルアイコンを右クリックしても「プロパティ」が表示されない。 2 2023/02/05 14:45
- Windows Vista・XP 電源ボタンでスリープするように設定の場合の強制終了方法 3 2022/06/21 14:00
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- 日本株 SBI証券HYPER SBI 2のエラー 1 2023/01/31 13:38
- フリーソフト AOMEI Backupper でバックアップが取れない 2 2022/07/17 22:28
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBA メッセージボックスを自動...
-
ACCESS側からEXCELの書式を設定...
-
エクセルVBAでクリップボード内...
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
シャットダウン時のExcel強制終...
-
Application.ScreenUpdating=Fa...
-
VB6 コマンドボタン クリック...
-
VC++2008にて、画面の動的変更...
-
起動後直に実行するコードはど...
-
B列に特定の文字列が入っている...
-
Timerのカウントダウンのしかた...
-
【C#】 あるイベントから別イ...
-
サスペンド(休止やスタンバイ...
-
VBA、UserFormを前面に出力して...
-
EXCEL VBA「Application.Displa...
-
Excelのワークシートに行を挿入...
-
Excel VBA で処理中断(DoEvents...
-
VBSで応答不要のメッセージボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBSで応答不要のメッセージボッ...
-
ACCESS側からEXCELの書式を設定...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
-
VBA kernel32 の意味
-
エクセルVBAでクリップボード内...
-
Excelのワークシートに行を挿入...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
手動かプログラムでの起動かの判断
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA 自動的に閉じるMsgBox
-
シャットダウン時のExcel強制終...
-
VBA、UserFormを前面に出力して...
-
<input type="file">タグで「キ...
-
Excel VBA 実行中に一瞬フリー...
-
「キャンセル」ボタン付きの処...
-
EXCEL VBA「Application.Displa...
おすすめ情報