stdio.h에는 rename 함수가 있습니다. 파일 이름을 바꿀 때 쓰는 함수입니다. 이 예제에서는 race condition을 생각하지 않도록 하겠습니다. 제 시스템은 아래와 같습니다.

 


 먼저, rename의 1번째 인자는 oldpath, 2번째 인자는 newpath입니다. 이 예제에서는 old가 a.txt이고, new가 A.txt입니다. 이는, a.txt라는 이름을 가진 파일을 A.txt로 바꾼다는 의미입니다. 성공하면 0을, 실패하면 0이 아닌 값을 돌려줍니다.

 

 a.txt에 12345라는 내용을 넣어보겠습니다. echo 12345 > a.txt를 하면 매우 간단하게 됩니다. 다음에, a.txt의 내용을 출력해 봅시다. 그랬더니 12345가 나왔습니다. 이제 제가 만든 프로그램인 re.c를 컴파일해서 실행시켜 보겠습니다.

 

 cat A.txt를 입력해 보겠습니다. 12345가 나왔습니다. 이제 다시 ls -ail | grep *.txt를 입력해 보겠습니다.

 

 

 a.txt가 A.txt로 바뀌었음을 알 수 있습니다. 그래서, 파일의 이름을 바꿀 때 쓰일 수 있습니다. mv가 그러한 기능을 제공하고 있어서 그럴 뿐입니다. 그런데 old가 이미 있는 파일인 경우는 어떻게 될까요? 

 

 제 시스템의 경우에는 덮어 씌워져 버리네요. 조금 당황스럽습니다. 파일이 이미 있는 경우에 거부를 하거나 아니면 최소한 rename을 하기 전에 확인을 받게 하는 방법이 없을까요?

 


 unistd.h에 있는 access 함수를 이용해 보겠습니다.

 

 A.txt가 있는지 확인하기 위해 F_OK를 2번째 인자에 넣었습니다. F_OK는 파일이 있는지 없는지를 체크하기 위함입니다. access가 성공하면 0을 리턴하므로, access의 리턴값이 0인 경우 File already exist! 라는 에러를 리턴하게 하였습니다.

 

 

 A.txt가 이미 있습니다. 프로그램 re를 실행해 보겠습니다.

 

 File already exists! 라는 에러가 떨어짐을 알 수 있습니다. 이 에러 문구를 출력하는 일은 else절에서 수행되기 때문에, if절 안에서 수행되는 rename을 수행하지 않았습니다.