를 사용하면 /bin/cp source_file destination_file
인수 중 하나가 블록 특수입니다.
답변1
소스 파일이 일반 파일이고 대상 블록 장치가 있는 경우(그리고 -i 명령줄 스위치가 없거나 -i 의 긍정이 없는 경우) POSIX는 [1] 대상이 O_WRONLY|로 open()되어야 한다고 말합니다. O_TRUNC, 그리고 소스 코드의 내용을 씁니다. POSIX는 [2] O_TRUNC(및 기타 특수한 경우)로 open()된 블록 장치의 동작이 정의된 구현이며 내 경험상 일반적으로 처음부터 재정의되며 소스가 있는 경우 나머지는 변경되지 않는다고 말합니다. 더 작습니다. GNU cp에는 --remove-destination 명령줄 스위치도 있습니다. 이 스위치는 소스 파일이 일반 파일이고 대상 블록 장치가 일반 파일인 경우 먼저 대상의 링크를 해제()한 다음 해당 위치에 일반 파일을 생성합니다.
소스 파일이 블록 장치이고 -R 명령줄 스위치가 사용되는 경우 POSIX는 대상이 소스와 동일한 파일 형식으로 생성되어야 함을 나타냅니다. 이는 일반적으로 해당 기본:보조 대상이 있는 mknod()입니다.
이제 까다로운 부분은 소스 파일이 블록 장치이고 -R이 없을 때 POSIX가 이를 무시하는 것 같다는 것입니다. FreeBSD 구현[4]은 대상을 open()하고 내용을 씁니다. 대조적으로, GNU[3]는 기본적으로 mknod() 대상을 사용하거나, --copy-contents가 사용되는 경우 open()을 수행하고 내용을 작성합니다.
[1] cp.1posix, POSIX.1-2017 셸 및 유틸리티https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cp.html
[2] 오픈.3posix
[3] cp, GNU Coreutilshttps://www.gnu.org/software/coreutils/manual/html_node/cp-inspirion.html
'-R' '-r' '--recursive' (...) 소스 파일과 동일한 유형의 대상 파일을 생성하여 특수 파일을 복사합니다. --copy-contents 옵션을 참조하세요.
텍스트는 "info" 형식 문서에 있지만 "man" 형식에는 없습니다.
[4] freebsd 배포/12.1.0https://github.com/freebsd/freebsd/blob/release/12.1.0/bin/cp/cp.c#L461
case S_IFBLK:
case S_IFCHR:
if (Rflag && !sflag) {
if (copy_special(curr->fts_statp, !dne))
badcp = rval = 1;
} else {
if (copy_file(curr, dne))
badcp = rval = 1;
}
int copy_special()
그리고 int copy_file()
bin/cp/utils.c에 정의되어 있습니다. 하나는 mknod(), 다른 하나는 open()으로 내용을 작성합니다.
Toybox(Android와 함께 제공되는 BSD 라이센스 비지박스 다중 호출 대체 제품)는 항상 콘텐츠를 작성하는 것 같습니다. 나중에 더 자세히 조사해 보겠습니다.