RENAME(2)

名前
rename - ファイルの名前や位置を変更する

書式
#include <stdio.h>

int rename(const char *oldpath, const char *newpath);

説明
rename はファイルの名前を変え、必要ならばディレクトリ間の移動を行なう。 他のそのファイルへの( link を使用して作られた ) ハード・リンク(hard link)には影響はない。 もし newpath が既に存在していた場合にはそれは自動的に置き換えられる (いくつかの条件がある - 以下のエラーを参照せよ)、それで、 newpath にアクセスしようとしている他のプロセスはそれを見失ってしまう。 もし newpath が存在し、何らかの理由で操作が失敗したか、システムが クラッシュした場合、 rename は newpath の実体を元のまま残すことを保証する。 一方で、上書きを行なう時に oldpath と newpath の両方でそのファイルを参照できる瞬間が存在する。 もし oldpath がシンボリック・リンク(symbolic link)を参照している場合はリンクの 名前が変えられる; もし newpath がシンボリック・リンクを参照している場合はリンクが上書きされる。

返り値
成功した場合はゼロを返す。エラーの場合は -1 を返し、 errno を適切に設定する。

エラー

EISDIR
    newpath は存在しているディレクトリである、しかし oldpath はディレクトリでない。

EXDEV
    oldpath と newpath が同じファイル・システムに存在しない。

ENOTEMPTY
    newpath が空でないディレクトリである。

EBUSY
    newpath が存在し、それがあるプロセスの現在のワーキング・ディレクトリ か、ルート・ディレクトリである。

EEXIST
    新しい pathname が古いものを一部を含んでいる。

EINVAL
    ディレクトリを自分自身のサブディレクトリに変更しようとした。

EMLINK
    oldpath は既に最大数までのリンクを持っているか、それがディレクトリで newpath を含んでいるディレクトリが最大数までのリンクを持っている。

ENOTDIR
    oldpath か newpath に含まれているディレクトリ部分が 実際にはディレクトリでない。

EFAULT
    oldpath または newpath がアクセス可能なアドレス空間の外を指している。

EACCES
    プロセスの実効(effective)ユーザーID に oldpath または newpath を含んでいるディレクトリの書き込み許可がないか、 oldpath または newpath のディレクトリ部分のどれかに検索(実行)許可がないか、 oldpath がディレクトリで( .. エントリーを更新するのに必要な)書き込み許可がない。

EPERM
    oldpath のあるディレクトリにスティッキー・ビット(sticky bit)が設定されており、 プロセスの実効ユーザーID が削除しようとするファイルのユーザーID とも それを含んでいるディレクトリのユーザーIDとも一致しない、または oldpath を含んでいるファイル・システムが要求したような型の名前の変更を サポートしていない。

ENAMETOOLONG
    oldpath または newpath が長過ぎる。

ENOENT
    oldpath または newpath のディレクトリ部分が存在しないか、壊れた(dangling)シンボリック・リンクである。

ENOMEM
    カーネル(kernel)に十分なメモリ(memory)が存在しない。

EROFS
    ファイルが読み込み専用(read-only)ファイル・システムにある。

ELOOP
    oldpath または newpath を解決する際に遭遇したシンボリック・リンクが多過ぎる。

ENOSPC
    ファイルを含んでいるデバイスに新しいディレクトリ・エントリを 作成するための空きがない。

準拠
POSIX, 4.3BSD, ANSI C

バグ
NFS ファイル・システムでは、操作が失敗したからといって、 ファイルの名前が変更できなったと仮定することはできない。 もしサーバー(server)が名前を変えてクラッシュした場合、 サーバーが再び立ち上がった時に処理された RPC は再送信され、 失敗を引き起こす。アプリケーション がこれを取り扱うことを期待される。同様の問題に関して link(2) を参照せよ。

関連項目
link(2), unlink(2), symlink(2), mv(1)