대상이 파일이 아니라 기호 링크라는 것을 알고 있다고 가정하면 링크 사용 rm
과 unlink
제거 사이에 차이점이 있습니까?
답변
이러한 유형의 질문이있을 때마다 실제 상황을 확인하기 위해 약간의 테스트를하는 것이 가장 좋습니다. 이를 위해을 사용할 수 있습니다 strace
.
풀리다
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
rm
$ touch file1
$ strace -s 2000 -o rm.log rm file1
2 개의 결과 로그 파일을 살펴보면 각 호출이 실제로 수행중인 작업을 “볼 수 있습니다”.
고장
시스템 호출을 unlink
호출 하면 다음과 unlink()
같습니다.
....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3) = 0
unlink("file1") = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
....
으로 rm
는 약간 다른 경로는 다음과 같습니다
....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid() = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK) = 0
unlinkat(AT_FDCWD, "file1", 0) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
...
시스템 은이 매뉴얼 페이지 ( http://linux.die.net/man/2/unlinkat)에 설명 된 차이점을 제외 unlink()
하고 unlinkat()
는 기본적으로 동일 합니다.
발췌
unlinkat () 시스템 호출은이 매뉴얼 페이지에 설명 된 차이점을 제외하고 unlink (2) 또는 rmdir (2)와 동일한 방식으로 작동합니다 (플래그에 AT_REMOVEDIR 플래그가 포함되는지 여부에 따라 다름).
pathname에 지정된 경로 이름이 상대 경로 인 경우 unlink (2) 및 rmdir (2에 의해 수행되는 것처럼 호출 프로세스의 현재 작업 디렉토리가 아닌 파일 디스크립터 dirfd가 참조하는 디렉토리를 기준으로 해석됩니다. )는 상대 경로 이름입니다.
pathname에 지정된 경로 이름이 상대 경로이고 dirfd가 특수 값 AT_FDCWD 인 경우, 경로 이름은 호출 프로세스의 현재 작업 디렉토리 (예 : unlink (2) 및 rmdir (2))를 기준으로 해석됩니다.
pathname에 지정된 경로 이름이 절대이면 dirfd는 무시됩니다.
답변
POSIX는 unlink
유틸리티가 C 라이브러리 unlink
함수를 호출하고 다른 것은 호출하지 않도록 지정합니다 . 옵션이 없습니다. 디렉토리가 아닌 다른 경로에 유효한 경로 이름을 전달하고 해당 오브젝트가있는 디렉토리에 대한 쓰기 권한이 있으면 unlink
제거하십시오.
rm
전통적인 유닉스 명령어는 약간의 다른 기능을 가지고 있으며 unlink
(아래 참조) 의 슈퍼 세트가 아닙니다 .
먼저 rm
안전 점검을 수행합니다. 그럼에도 불구하고 rm
쓰기 권한이없는 개체를 제거 하려고 시도하면 (삭제 권한과 무관 : 직접 권한이 있습니다!)을 지정 rm
하지 않으면 거부 -f
합니다. rm
파일이 존재하지 않으면 일반적으로 불평합니다 unlink
. 그러나와 -f
, rm
불평하지 않습니다. 이것은 종종 Makefiles ( clean: @rm -f $(OBJS) ...
) 에서 악용 되므로 make clean
제거 할 것이 없어도 실패하지 않습니다.
둘째, rm
이 -i
대화 삭제를 확인하는 옵션을 선택합니다.
셋째, rm
이 -r
반복적으로 무언가 디렉토리, 제거하기위한 unlink
C 라이브러리 기능은 그렇게하지 않기 때문에, 할 필요하지 않습니다.
이 unlink
유틸리티는 정확히 제거되지 않았습니다 rm
. 그것은 수행하는 것의 부분 집합을 수행 rm
하지만 rm
with -f
와 rm이 없는 시맨틱을 가지고있다 -f
.
자체 권한에 관계없이 일반 파일 만 제거하려고한다고 가정하십시오. 또한 파일이 존재하지 않거나 다른 이유로 명령이 실패한다고 가정하십시오. 요구 사항 rm file
도 rm -f file
충족 하지도 않습니다 . rm file
파일을 쓸 수 없으면 거부합니다. 그러나 rm -f file
파일이 없으면 불만을 소홀히합니다. unlink file
일을한다.
unlink
아마 때문에 도입 rm
이 너무 영리하다 : 때로는 그냥 순수 유닉스하려는 unlink
의미는 : “디렉토리 권한을 허용하는 경우이 디렉토리 항목이 사라 확인하십시오” .
답변
단일 파일을 사용하여 rm 과 unlink 는 동일한 작업을 수행하고 파일을 제거하십시오. POSIX 정의로서, rm
그리고 unlink
모두 호출하기 () 해제 시스템 호출을.
GNU에서 rm
, 그 호출 () unlinkat 받는 동등한 시스템 호출, unlink()
또는 RMDIR () 로 상대 경로를 지정하는 경우를 제외하고 기능.
노트
일부 시스템에서는 unlink
디렉토리를 제거 할 수도 있습니다. 적어도 GNU 시스템에서는 unlink
디렉토리 이름을 절대 삭제할 수 없습니다.