RENAME(2)

이름
rename - 파일의 이름이나 위치를 변경

사용법
#include <stdio.h>

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

설명
rename 은 파일의 이름을 바꾸거나, 필요하다면, 디렉토리간에 파일을 이동시킨다. 기타 파일에 하드링크된 파일들(.BR link (2))를 사용해서 만들어진 것)은 영향을 받지 않는다. 만일 newpath already exists it will be atomically replaced (subject to a few conditions - see ERRORS below), so that there is no point at which another process attempting to access newpath will find it missing. 가 이미 존재한다면, newpath는 자동적으로 대체될 것이다. 따라서 .I newpath에 접근하고자 하는 다른 프로세스는 그 것이 없어졌다는 것을 발견할 점이 없다. 만일 .I newpath가 존재하고, 연산이 몇가지 이유때문에 실패한다면, rename은 .I newpath의 예를 적절한 곳에 남겨둘 것을 보증한다. 그러나, 겹쳐쓰기할때, oldpath과 newpath 모두 파일의 이름이 바뀌었음을 가리키는 창이 있을 것이다. 만일 .I oldpath가 심볼릭 링크되어 있으면, 링크의 이름은 바뀐다. 만일 .I newpath가 심볼릭 링크되어 있으면, 링크는 겹쳐쓰기 된다.

반환값
성공하면, zero가 리턴되고, 에러가 발생하면, -1가 리턴되며, errno가 적절하게 설정된다.

에러

EISDIR
    newpath는 기존 디렉토리이지만, oldpath는 디렉토리가 아니다.

EXDEV
    oldpath와newpath 는 동일한 파일시스템 상에 있지 않는다.

ENOTEMPTY or EEXIST
    newpath 는 빈 디렉토리가 아니다. 예를 들어 .와 .. 이상의 내용들을 갖고 있다.

EBUSY
    oldpath또는newpath가일부프로세스(현행작업디렉토리,루트디렉토리,또는읽기를 위해 열린 경우로서)에 의해 사용되는 디렉토리이거나, 시스템(마운트 포인트)에 의해 사용되는 디렉토리이기 때문에, rename은 실패한다. 반면에 시스템은 이를 에러로 간주한다. (이런 경우 EBUSY를 리턴할 필요가 없다는 것을 참고하라. rename을 실행하는데 있어 잘못된 점은 하나도 없다. 하지만, 만일 시스템이 이러한 상황들을 제어하지 못한다면, EBUSY의 리턴이 허용된다.)

EINVAL
    새로운 경로명은 경로 오래된 경로명의 접두사를 포함하거나, 그 자체의 디렉토리를 그 자체의 하위 디렉토리로 만들려는 시도가 이루어진다.

EMLINK
    oldpath 는 이미 최대 그에 대한 최대 숫자의 링크들을 갖고 있거나, newpath를 포함하는 디렉토리는 최대 숫자의 링크들을 갖고 있다.

ENOTDIR
    oldpath또는newpath에서디렉로리로서사용되는구성요소는사실상디렉토리가아니다. Or, oldpath 는 디렉토리이고, newpath 는 존재하지만, 디렉토리가 아니다.

EFAULT
    oldpath또는newpath는여러분의액세스가가능한주소공간의밖을가리킨다.

EACCES
    oldpath또는newpath를포함하는디렉토리에대한쓰기접근은프로세스의 유효 UID에 대해 허용되지 않거나, .IR oldpath 또는 newpath내의 디렉토리들중 하나가 검색(실행) 권한을 허용하지 않거나, .I oldpath가 디렉토리이면서 쓰기 권한(.B .. 항목을 업데이트할 필요가 있다)을 허용하지 않는다.

EPERM또는EACCES
    oldpath를 포함하는 디렉토리는 스티키 비트를 설정되도록 하고, 프로세스의 유효 UID는 루트의 UID도, 삭제될 파일의 UID도, 이를 포함하는 디렉토리의 UID도 아니거나, newpath는 존재하는 파일이다. 그리고 이를 포함하는 디렉토리는 스티키 비트가 설정되 도록하고, 프로세스의 유효 UID는 루트의 UID도, 대체될 파일의 UID도, 이를 포함하는 디렉토리의 UID도 아니다. 또는 .IR pathname를 포함하는 파일시스템은 요청된 타입의 이름바꾸기(rename)를 지원하지 않는다.

ENAMETOOLONG
    oldpath또는newpath가너무길다.

ENOENT
    oldpath 또는 newpath내의 디렉토리 구성요소가 존재하지 않거나, 심볼릭 링크이다.

ENOMEM
    사용할 수 있는 커널 메모리가 충분하지 않다.

EROFS
    파일은 오직 읽기가 가능한 파일시스템상에 있다.

ELOOP
    oldpath또는newpath을결정하는데있어,너무나많은심볼릭링크들과마주치게된다.

ENOSPC
    파일을 포함하는 장치는 새로운 디렉토리 항목에 대한 여유가 없다.

호환
POSIX, 4.3BSD, ANSI C

버그
NFS 파일시스템에서, 여러분은 연산이 실패하면, 파일의 이름바꾸기가 안된다는 가정을 해서는 안된다. 만일 서버가 연산을 rename하고, 붕괴되면, 서버가 다시 되살아난 이후에 처리될 다시 전송된 RPC는 실패하게 된다. 어플리케이션은 이를 다루도록 되어 있다. 이와 비슷한 문제에 대해서는 .BR linux(2)를 참조하라.

관련 항목
link(2), unlink(2), symlink(2), mv(1)

역자
ASPLINUX<man@asp-linux.co.kr>, 2000년 7월 26