web-dev-qa-db-ja.com

Macアプリはどのようにしてファイルの場所を追跡できますか?

Macで次のような動作を観察します。

  • PDF with PDF Expertで開き、ファイルに変更を加え、Finderでファイルを移動し、PDF =エキスパート。新しい場所に正しく保存されます。
  • ~/fooなどのディレクトリでシェルを開き、別のアプリでディレクトリをゴミ箱に移動すると、シェルのpwdは~/.Trash/fooを正しく出力します。

フードの下で何が起こっていますか?これらのケースは、アプリがemacsのようにファイルの絶対パスを保持しているだけではないことを示しているようです(これで問題ありませんか?)、またはまったく異なるメカニズムですか?

18
nichijou

以下の答えは誤りです(コメントを参照してください。無視してください


Thecarpyが与えた良い答えに加えて、あなたのプログラムは単にファイルを保持している可能性がありますhandleこれはディレクトリツリー内のファイルの場所とは無関係です(そしてUnixシステムではファイルの削除も持続します、少なくとも閉じるまで)。

ファイルハンドルは基本的に、ファイルへの直接アクセスであり、ディレクトリ構造内のファイルの場所や頻度(ハードリンクの場合)とは無関係です。

1
Tom

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プログラムが「Finished sleep、writing to file」を出力する前。 (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

免責事項:私は「インクルード」リストを排除していません、これはポイントを証明するためにすぐにハッキングされました。

0
thecarpy