関数仕様
書式
|
1 2 3 4 |
#include <unistd.h> int unlink(const char *pathname); |
引数
| pathname | エントリを削除するファイルのパス名 |
戻り値
| 0 | ファイルエントリの削除に成功 |
| -1 | エラーが発生(errno にエラー番号がセットされています) |
代表的なエラー(errno)
- EACCES
unlink を呼び出したプロセスの実効ユーザ ID に書き込み権限がない - EBUSY
システムか別のプロセスがそのファイルを使用中のため、unlink できない - ENOENT
指定された pathname に対応する実態が存在しない
機能
- ディレクトリから pathname で指定したファイルのエントリを削除する
- pathname で指定したファイルのリンクカウントが 1 減少する
リンクカウントが 0 になり、どのプロセスからもそのファイルがオープンされていない場合、
ファイルの実態も削除される
裏技的な使い方
上記「機能」で紹介した 2 つめのリンクカウントを利用します。
ポイント
- リンクカウントが 0 になったとしても、そのファイルをオープン中のプロセスが存在する場合、
そのプロセスが終了するまでファイルの実態は削除されません - ファイルの実態が存在していも、ディレクトリのファイルエントリは削除されるため、
ディレクトリ上ではファイルの存在が見えません - そのファイルをオープン中のプロセスは、取得済みのファイル記述子を使って読み書き可能です
つまり、、、
完全な隠しファイルを作成・操作することができます。
また、プロセス内で使用する一時的なファイルをこの状態にしておくと、
異常終了した際などでも自動でファイルの実態が削除されることになります。
サンプルプログラム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #define SHADOW_FILEPATH "/tmp/my_shadow.txt" int main(void) { int fd; fd = open(SHADOW_FILEPATH, (O_RDWR | O_CREAT), 0664); if (fd < 0) return -1; if (unlink(SHADOW_FILEPATH) < 0) { perror("unlink"); close(fd); return -1; } /* 処理を書く。 自プロセスからはアクセス可能 他プロセスからはファイルが見えない */ close(fd); /* ここでファイルの実態が削除される */ return 0; } |