名前
- Provided by: manpages-ja-dev (Version: 0.5.0.0.20140515+dfsg-2)
- Source: manpages-ja
- Report a bug
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);
#include <fcntl.h> /* AT_* 定数の定義 */
#include <stdio.h>
int renameat(int olddirfd, const char *oldpath,
int newdirfd, const char *newpath);
glibc
向けの機能検査マクロの要件
(feature_test_macros(7) 参照):
renameat():
rename() はファイルの名前を変更し、必要ならばディレクトリ間の移動を行なう。 そのファイルに対する (link(2) を使用して作られた) 他のハードリンク (hard link) には影響はない。 オープン済の oldpath に対するファイルディスクリプタにも影響はない。
newpath が既に存在する場合、それは不可分操作で (atomically) 置き換えられる (ただし、いくつかの条件がある; 以下の「エラー」のセクションを参照)。 そのため、 newpath にアクセスしようとしている他のプロセスがファイルを見失うことはない (訳註: 常にアクセス可能である)。
oldpath と newpath がどちらも既存のハードリンクで、同じファイルを参照している場合、 rename() は何も行わず、ステータスとして成功を返す。
newpath が存在し、何らかの理由で操作が失敗した場合、 rename() は newpath の実体を元のまま残すことを保証する。
oldpath にはディレクトリを指定することもできる。 この場合、 newpath は存在しないか、空のディレクトリでなければならない。
一方で、上書きを行なう場合は、rename が行なわれるファイルを oldpath と newpath の両方で参照できる瞬間がおそらく存在する。
oldpath がシンボリックリンク (symbolic link) を参照している場合は、 リンクの名前が変更される。 また、 newpath がシンボリックリンクを参照している場合は、リンクが上書きされる。
renameat() システムコールは rename() と全く同様に動作するが、以下で説明する点が異なる。
oldpath で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター olddirfd が参照するディレクトリに対する相対パスと解釈される (rename(2) に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。
oldpath で指定されたパス名が相対パスで、 olddirfd が特別な値 AT_FDCWD の場合、 (rename(2) と同様に) oldpath は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。
oldpath で指定されたパス名が絶対パスの場合、 olddirfd は無視される。
newpath の解釈は oldpath と同じである。 相対パスのパス名がファイルディスクリプター newdirfd が参照するディレクトリと解釈される点だけが異なる。
renameat() の必要性についての説明については openat(2) を参照。
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。
renameat() では以下のエラーも発生する。
renameat() はカーネル 2.6.16 で Linux に追加された。 ライブラリによるサポートはバージョン 2.4 で glibc に追加された。
rename(): 4.3BSD, C89, C99, POSIX.1-2001, POSIX.1-2008.
renameat(): POSIX.1-2008.
NFS ファイルシステムでは、操作が失敗したからといって、 ファイルの名前が変更できなかったと決めてかかることはできない。 サーバが rename 操作を終えてからクラッシュした場合、 サーバが再び立ち上がったときに、 再送信された RPC が処理されるが、これは失敗となる。 アプリケーションはこの問題を正しく取り扱うことが期待されている。 同様の問題について link(2) にも書かれている。
mv(1), chmod(2), link(2), symlink(2), unlink(2), path_resolution(7), symlink(7)
この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。