Win32にCreateFile
は がありますFILE_FLAG_DELETE_ON_CLOSE
が、私は Linux を使用しています。
プログラムの終了時に常に削除される一時ファイルを開きたいです。プログラムがクラッシュした場合、これを保証するのは現実的ではないかもしれないことは理解できましたが、それ以外の場合は動作させたいと思っています。
私はRAIについて知っています。信号については知っています。について知っていatexit(3)
ます。ファイルを開いてすぐに削除できることはわかっていますが、ファイル記述子が閉じられるまで (クラッシュを処理することさえあります)、ファイルは引き続きアクセス可能です。これらのどれも完全で簡単な解決策のようには見えません:
- RAII: 行ったこと: デストラクタがファイルを削除するオブジェクトがありますが、プログラムがシグナルによって終了された場合、デストラクタは呼び出されません。
- シグナル: シグナル ハンドラーの登録をトリッキーな命題にする低レベルのライブラリを作成しています。たとえば、アプリケーションがシグナル自体を使用する場合はどうなるでしょうか。つま先を踏みたくない。対処するために を巧妙に使用することを検討するかもしれません
sigaction(2)
が、この可能性についてはまだ十分に考えていません。 atexit(3)
: 異常終了時に呼び出されないため (たとえば、シグナルを介して)、明らかに役に立たない。- preemptive
unlink(2)
: ファイルをファイル システムに表示したままにしておく必要があることを除けば、これは非常に優れています (そうしないと、システムの監視やトラブルシューティングが難しくなります)。
ここで何をしますか?
詳細説明
元の投稿で 1 つの詳細を省略しましたが、含める必要があったことに今気づきました。この場合の「ファイル」は、厳密には通常のファイルではなく、POSIX メッセージ キューです。経由で作成しmq_open()
ます。mq_close()
orで閉じることができますclose()
(前者は私のシステムでは後者のエイリアスです)。経由でシステムから削除できますmq_unlink()
。ファイルが存在するディレクトリを選択できないことを除いて、これらすべてが通常のファイルに似ています。/tmp
「ファイル」は非常に限られた容量の仮想ファイルシステムでシステムによって作成されるため、これにより、現在最も一般的な回答 (ファイルを に配置する) が機能しなくなります。/dev/mqueue
(の例に従って、仮想ファイルシステムを にマウントしましたman mq_overview
) 。
これは、名前を表示したままにしておく必要がある理由も説明しています (即時リンク解除アプローチが機能しなくなります)。「ファイル」は 2 つ以上のプロセス間で共有する必要があります。