C言語

【C言語】unlink関数の裏技的な使い方

関数仕様

書式

引数

pathname エントリを削除するファイルのパス名

戻り値

0 ファイルエントリの削除に成功
-1 エラーが発生(errno にエラー番号がセットされています)

代表的なエラー(errno)

  • EACCES
    unlink を呼び出したプロセスの実効ユーザ ID に書き込み権限がない
  • EBUSY
    システムか別のプロセスがそのファイルを使用中のため、unlink できない
  • ENOENT
    指定された pathname に対応する実態が存在しない

 

機能

  • ディレクトリから pathname で指定したファイルのエントリを削除する
  • pathname で指定したファイルのリンクカウントが 1 減少する
    リンクカウントが 0 になり、どのプロセスからもそのファイルがオープンされていない場合、
    ファイルの実態も削除される

 

裏技的な使い方

上記「機能」で紹介した 2 つめのリンクカウントを利用します。

ポイント

  • リンクカウントが 0 になったとしても、そのファイルをオープン中のプロセスが存在する場合、
    そのプロセスが終了するまでファイルの実態は削除されません
  • ファイルの実態が存在していも、ディレクトリのファイルエントリは削除されるため、
    ディレクトリ上ではファイルの存在が見えません
  • そのファイルをオープン中のプロセスは、取得済みのファイル記述子を使って読み書き可能です

つまり、、、
完全な隠しファイルを作成・操作することができます。

また、プロセス内で使用する一時的なファイルをこの状態にしておくと、
異常終了した際などでも自動でファイルの実態が削除されることになります。

 

サンプルプログラム

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C言語
-, ,