리눅스 시스템에서는 파일을 삭제하는 시스템 호출로 unlink, remove, rmdir 함수를 제공하고 있어요.
unlink는 연결 계수를 1 감소하는 시스템 호출이고 rmdir은 비어있는 디렉토리를 지울 때 사용하는 시스템 호출입니다. remove는 표준 입출력 라이브러리 함수로 입력 인자로 전달하는 이름이 파일일 때는 unlink와 같고 디렉토리일 때는 rmdir과 같습니다.
#include <unistd.h >
int unlink(const char *pathname);
반환 값: 실패 시 -1, 성공 시 0
#include <stdio.h>
int remove(const char *pathname);
반환 값: 실패 시 -1, 성공 시 0
#include <sys/types.h>
#include <sys/stat.h>
int rmdir(const char *pathname);
반환값: 실패 시 -1, 성공 시 0
unlink는 파일의 연결 계수를 1 줄이는 시스템 호출입니다. 만약 unlink 호출 시 연결 계수를 줄였을 때 연결 계수가 0이면 파일을 삭제합니다. 만약 현재 특정 프로세스에서 해당 파일을 사용 중일 때 unlink 함수를 호출하면 연결 계수를 1 줄여도 0이 아닙니다. 이 때는 파일을 바로 삭제하지 않고 해당 파일에 접근하고 있는 작업이 모두 완료하여 연결 계수가 0으로 바뀌면 삭제합니다.
다음은 특정 파일을 연 후에 unlink 함수를 호출하여 바로 삭제하는 지 확인하는 코드입니다. unlink 함수 호출 후에 write 함수로 쓰기 작업을 시도하여 성공하였는지 여부를 출력하게 하였는데 만약 삭제하였다면 쓰기 작업은 실패하고 삭제하지 않았다면 쓰기 작업은 성공할 것입니다. 실제 실행해 보면 파일 쓰기를 성공합니다. 이는 unlink 함수를 호출해도 연결 계수가 0으로 줄지 않아서 바로 삭제를 하지 않음을 알 수 있어요. 그리고 프로그램이 끝나고 난 후에 파일 목록을 보면 존재하지 않다는 것을 알 수 있어요. 이를 통해 해당 파일의 접근 계수가 0으로 바뀌면 삭제하는 것을 알 수 있습니다.
/********************************************************************** * ex_unlink.c * * exmple source – test unlink * **********************************************************************/ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> int main() { int fd=0; fd = open("demo",O_WRONLY|O_CREAT|O_TRUNC); if(fd == -1) { perror("error open"); return 1; } unlink("demo"); char buf[10]="Hello"; int re = write(fd, buf, 10); if(re == 10) { printf("write ok\n"); } else { printf("write fail\n"); } close(fd); return 0; }
여러분께서는 비어있지 않은 디렉토리를 삭제하는 프로그램을 만들어 보세요.