Como os aplicativos Mac conseguem rastrear a localização de um arquivo?

18

Observo um comportamento como este no meu Mac:

  • Abra um PDF com o PDF Expert, faça algumas alterações no arquivo, mova o arquivo no Finder, salve-o no PDF Expert e ele será salvo corretamente no novo local.
  • Abra um shell em um diretório como ~/foo, lixeira o diretório com outro aplicativo e o pwd do shell será exibido corretamente ~/.Trash/foo.

O que está acontecendo sob o capô? Esses casos parecem indicar que os aplicativos não mantêm apenas um caminho absoluto do arquivo como o emacs (estou certo com isso?), Ou é um mecanismo totalmente diferente?

nichijou
fonte

Respostas:

21

O macos possui um /.vol/sistema especial mapeado para o diretório e arquivos reais. Os arquivos e diretórios são acessíveis via /.vol/<device_id>/<inode_number>, independentemente de onde os arquivos estejam no sistema de arquivos.

É um sistema pequeno e agradável.

Assim, os programas podem, por exemplo, obter o número do inode /Users/jdoe/someFile.txte, em seguida, abri-lo via /.vol/12345/6789(nesse caso, o ID do dispositivo é 12345 e o número do inode 6789). Você então se move para /Users/jdoe/someFile.txtqualquer lugar que desejar (no mesmo volume) e tudo funciona. Você pode até escrever um script de shell que suporte isso magic.

ls -di <file> para obter o número do inode.

$ ls -di /User/jdoe/someFile.txt
6789 /User/jdoe/someFile.txt

EDITAR:

Você statpode obter o ID do número do volume e do inode, de acordo com a resposta vinculada, conforme destacado pelo IMSoP.

GetFileInfo /.vol/12345/6789retornaria a localização atual do arquivo anteriormente localizado em /Users/jdoe/someFile.txt.

Consulte /programming/11951328/is-there-any-function-to-retrieve-the-path-associated-with-an-inode para obter mais informações.

thecarpy
fonte
11
De acordo com as respostas vinculadas, staté um comando mais útil aqui do que ls -di, pois informa o ID do volume / dispositivo, bem como o número do ID do arquivo / inode.
IMSoP
4
No Debian eu não tenho /.vol/e isso ainda acontece (embora eu precise pwd -P, somente então a saída do plain pwdé atualizada). Eu acho que os programas não precisam abrir arquivos por nenhum caminho especial, porque em geral eles obtêm (e mantêm) descritores de arquivos que são mapeados para inodes pelo kernel de qualquer maneira. Eu suspeito que no Mac /.vol/não é essencial também.
Kamil Maciorowski
Portanto, se você mover um arquivo para um disco diferente, esse esquema será interrompido.
Joel Coehoorn
11
@JoelCoehoorn Sim, mas tecnicamente você não pode mover um arquivo para um disco diferente. Você pode copiá-lo para o outro disco e excluí-lo, e existem atalhos para fazer isso como "uma etapa", mas ainda assim é uma cópia e exclusão, não uma movimentação, portanto, tecnicamente, um arquivo diferente.
Ibrewster #
11
Muitos editores de texto leem um determinado arquivo, fecham-no, trabalham com sua cópia e salvam no mesmo caminho, para recriar o arquivo em seu antigo local. Mas eles podem manter o arquivo aberto o tempo todo e gravá-lo no final. Meu bashno Debian faz isso. Eu corro exec 3<>foo, movi-me foodentro do mesmo sistema de arquivos echo whatever >&3e depois fiz fooo check- in no novo local - e ele mudou. Embora bashnão possa procurar dentro do arquivo, outros programas em geral podem. O que /.vol/quero dizer é que não é essencial, os programas podem facilmente funcionar assim sem ele. Ou não entendo qual é a diferença.
Kamil Maciorowski
1

A resposta abaixo é falsa (ver comentários). Por favor ignore


Além da boa resposta que o carro deu, é provável que seus programas simplesmente mantenham um identificador de arquivo , independente da localização dos arquivos na árvore de diretórios (e nos sistemas Unix ainda persistem na exclusão do arquivo, pelo menos até você fechá-lo) )

Um identificador de arquivo é basicamente o acesso direto ao arquivo, independentemente de onde ou com que frequência (no caso de hardlinks) ele existe na estrutura de diretórios.

Tom
fonte
Não, você também não conseguiu, acho ... veja meu comentário para @KamilMaciorowski. O manipulador de arquivo não muda; quando você salva o arquivo, um novo arquivo é criado no local original .... não é o que acontece no macos!
Thecarpy
11
Você está correto, isso é muito inesperado e muito diferente do Unix. :( #
Tom
Concordado e votado!
Thecarpy
0

Embora eu não saiba por que o macos usa isso em vez da funcionalidade C padrão, assumindo que o que li anos atrás no "Mac OS X Unleashed" esteja correto, acontece que aprendi algo novo novamente.

Por favor, observe o seguinte programa C simples:

#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);
}

Compile o programa, execute-o em segundo plano e rapidamente mv file.txt file2.txtANTES que o programa imprima "Suspensão concluída, gravando em arquivo". (você tem 10 segundos)

Observe que file2.txtpossui a saída do seu programa, embora ele tenha sido movido antes da impressão do texto no arquivo (via descritor de arquivo).

$ 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

AVISO LEGAL: Eu não removi a lista "incluir", ela foi rapidamente cortada em conjunto para provar um argumento.

thecarpy
fonte