Mac에서 다음 동작을 관찰했습니다.
- PDF Expert를 사용하여 PDF를 열고, 파일을 일부 변경하고, Finder에서 파일을 이동하고, PDF Expert에 저장하면 새 위치에 올바르게 저장됩니다.
- 유사한 디렉토리에서 쉘을 열고
~/foo
다른 애플리케이션으로 디렉토리를 휴지통에 넣으면 쉘의 pwd가 올바르게 출력됩니다~/.Trash/foo
.
뒤에서 무슨 일이 일어나는가? 이러한 상황은 응용 프로그램이 emacs처럼 파일에 대한 절대 경로를 저장하지 않는다는 것을 나타내는 것 같습니다(제 말이 맞습니까?), 아니면 완전히 다른 메커니즘입니까?
답변1
macos에는 /.vol/
실제 디렉토리와 파일에 매핑되는 특별한 시스템이 있습니다. /.vol/<device_id>/<inode_number>
파일 및 디렉터리는 파일 시스템의 위치에 관계없이 액세스할 수 있습니다.
좋은 작은 시스템입니다.
따라서 프로그램은 inode 번호를 얻은 /Users/jdoe/someFile.txt
다음 /.vol/12345/6789
이를 열 수 있습니다(이 경우 장치 ID는 12345이고 inode 번호는 6789입니다). 그런 다음 /Users/jdoe/someFile.txt
원하는 곳(동일한 볼륨) 으로 이동할 수 있으며 모든 것이 잘 작동합니다. 이 기능을 지원하는 쉘 스크립트를 작성할 수도 있습니다 magic
.
ls -di <file>
인덱스 노드 번호를 가져옵니다.
$ ls -di /User/jdoe/someFile.txt
6789 /User/jdoe/someFile.txt
편집하다:
stat
IMSoP 강조 표시된 링크 답변에서 볼륨의 ID와 inode 번호를 얻을 수 있습니다 .
GetFileInfo /.vol/12345/6789
이전에 에 있던 파일의 현재 위치를 반환합니다 /Users/jdoe/someFile.txt
.
바라보다https://stackoverflow.com/questions/11951328/is-there-any-function-to-retrieve-the-path-linked-with-an-inode더 많은 정보를 알고 싶습니다.
답변2
아래 답변은 잘못되었습니다(댓글 참조). 무시하세요
thecarpy가 제공한 좋은 답변 외에도 귀하의 프로그램은 파일을 저장하는 것일 가능성이 높습니다.다루다, 이는 디렉토리 트리의 파일 위치와 무관합니다(그리고 Unix 시스템에서는 적어도 파일을 닫을 때까지 파일 삭제가 지속됩니다).
파일 핸들은 기본적으로 디렉터리 구조에서 파일의 위치나 빈도(하드 링크의 경우)에 관계없이 파일에 대한 직접 액세스입니다.
답변3
macOS가 표준 C 기능 대신 이것을 사용하는 이유는 확실하지 않지만 몇 년 전에 "Mac OS X Unleashed"에서 읽은 내용이 정확하다고 가정하면 다시 새로운 것을 배웠다는 것이 밝혀졌습니다.
다음과 같은 간단한 C 프로그램을 고려해보세요:
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
struct timespec ts;
ts.tv_sec = 10;
ts.tv_nsec = 0;
FILE * fp;
fp = fopen("file.txt", "a");
int f = fileno(fp);
if (fp == NULL)
{
printf("Error opening file!\n");
exit(1);
}
struct stat file_stat;
int ret;
ret = fstat (f, &file_stat);
printf("inode number is %d\n", file_stat.st_ino);
nanosleep(&ts, NULL);
printf("Finished sleep, writing to file.\n");
/* print some text */
const char *text = "Write this to the file";
dprintf(f, "Some text: %s\n", text);
/* print integers and floats */
int i = 1;
float py = 3.1415927;
dprintf(f, "Integer: %d, float: %f\n", i, py);
/* printing single characters */
char c = 'A';
dprintf(f, "A character: %c\n", c);
close(f);
}
프로그램을 컴파일하고 백그라운드에서 빠르게 실행하면 mv file.txt file2.txt
프로그램이 "완전 절전 모드, 파일에 쓰기"를 인쇄합니다. (10초 남았습니다)
file2.txt
텍스트가 파일에 인쇄되기 전에 파일 설명자를 통해 이동되었지만 프로그램의 출력이 있다는 점에 유의하세요 .
$ gcc myfile.c
$ ./a.out &
[1] 21416
$ inode number is 83956
$ ./mv file.txt file2.txt
$ Finished sleep, writing to file.
[1]+ Done ./a.out
$ cat file2.txt
Some text: Write this to the file
Integer: 1, float: 3.141593
A character: A
면책 조항: "포함" 목록을 정리하지 않았으며 이를 증명하기 위해 신속하게 정리했습니다.