EN JA
UNLINK(2)
UNLINK(2) FreeBSD System Calls Manual UNLINK(2)

名称

unlink, unlinkatディレクトリエントリの削除

ライブラリ

Standard C Library (libc, -lc)

書式

#include < unistd.h>

int
unlink( const char *path);

int
unlinkat( int fd, const char *path, int flag);

解説

unlink() システムコールは、 path で指定されたリンクをディレクトリから削除し、そのリンクで参照されていたファイルのリンク数を減らします。ファイルのリンク数が 0 になり、ファイルをオープンしているプロセスがなくなると、ファイルに関連するすべてのリソースが再利用されます。最後のリンクが削除されたときに、ファイルをオープンしているプロセスが 1 つ以上あると、リンクは削除されますが、ファイルの削除は、そのファイルへのすべての参照がクローズされるまで延期されます。 path 引数は、ディレクトリであってはなりません。

unlinkat() システムコールは、 path が相対パスを指定する場合を除いて、 unlink() または rmdir() と同等です。この場合、削除されるディレクトリエントリは、カレントワーキングディレクトリの代わりにファイル記述子 fd に関連しているディレクトリに相対的に決定されます。

flag のための値は、 < fcntl.h> で定義され、次のリストからフラブのビット単位の包括的論理和 (OR) によって構成されます:

AT_REMOVEDIR
通常のファイルではなく、ディレクトリとして fdpath によって指定されたディレクトリエントリを削除します。

unlinkat() が、 fd パラメータの特別な値 AT_FDCWD を渡されるなら、カレントワーキングディレクトリが、使用され、振る舞いは、 AT_REMOVEDIR ビットが flag に設定されているかどうかにより、それぞれ unlink または rmdir への呼び出しと同じです。

戻り値

The unlink() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

unlink() は、以下の場合に処理を失敗します:
[ ENOTDIR]
パスの構成要素中にディレクトリ以外のものが含まれています。
[ EISDIR]
指定されたファイルが、ディレクトリです。
[ ENAMETOOLONG]
パス名の構成要素が 255 文字を越えているか、またはパス名全体が 1023 文字を越えています。
[ ENOENT]
指定されたファイルが存在しません。
[ EACCES]
前置パス名の構成要素について検索許可が拒否されています。
[ EACCES]
削除するリンクを含むディレクトリで、書み込み許可が拒否されています。
[ ELOOP]
パス名を変換するときに検出されたシンボリックリンクが多すぎます。
[ EPERM]
指定されたファイルがディレクトリになっています。
[ EPERM]
指定されたファイルには、不変、削除不可、または、追加専用フラグが設定されています、詳細については、 chflags(2) マニュアルページを参照してください。
[ EPERM]
ファイルを含むディレクトリがスティッキとマークされ、削除するファイルを含むディレクトリまたはファイルが、有効なユーザ ID に所有されていません。
[ EPERM]
指定されたファイルの親のディレクトリには、不変、または、追加専用フラグが設定されています。
[ EIO]
ディレクトリエントリの削除中か、inode の割り当て解除中に入出力エラーが発生しました。
[ EROFS]
指定されたファイルは読み込み専用ファイルシステム上にあります。
[ EFAULT]
path 引数が、プロセスに割り当てられたアドレス空間の範囲外を指しています。

unlink() によって返されたエラーに加えて unlinkat() は、次の場合に失敗します:

[ EBADF]
path 引数が、絶対パスを指定していません、そして fd 引数は、 AT_FDCWD でもなく検索のためにオープンされた有効なファイル記述子でもありません。
[ ENOTEMPTY]
flag パラメータには、 AT_REMOVEDIR ビットの設定があり、 path 引数が空のディレクトリでないディレクトリを指定するか、またはドット (.) 以外のディレクトリか、またはドットドット (..) の単一のエントリへのハードリンクがあります。
[ ENOTDIR]
flag パラメータには、 AT_REMOVEDIR ビットの設定があり、 path がディレクトリを指定していません。
[ EINVAL]
flag 引数の値は、有効ではありません。
[ ENOTDIR]
path 引数が、絶対パスではありません、そして fd が、 AT_FDCWD でもなくディレクトリに関連しているファイル記述子でもありません。

規格

unlinkat() システムコールは、The Open Group Extended API Set 2 仕様に従っています。

歴史

unlink() 関数は、 Version 6 AT&T UNIX で登場しました。 unlinkat() システムコールは FreeBSD 8.0 で登場しました。

従来の unlink() システムコールでは、スーパユーザがディレクトリを削除できてしまい、これによってファイルシステムの完全性が破壊されることがありました。この実装は、もはや許可されていません。

April 25, 2010 FreeBSD