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?
fonte
stat
é um comando mais útil aqui do quels -di
, pois informa o ID do volume / dispositivo, bem como o número do ID do arquivo / inode./.vol/
e isso ainda acontece (embora eu precisepwd -P
, somente então a saída do plainpwd
é 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.bash
no Debian faz isso. Eu corroexec 3<>foo
, movi-mefoo
dentro do mesmo sistema de arquivosecho whatever >&3
e depois fizfoo
o check- in no novo local - e ele mudou. Emborabash
nã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.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.
fonte
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:
Compile o programa, execute-o em segundo plano e rapidamente
mv file.txt file2.txt
ANTES que o programa imprima "Suspensão concluída, gravando em arquivo". (você tem 10 segundos)Observe que
file2.txt
possui a saída do seu programa, embora ele tenha sido movido antes da impressão do texto no arquivo (via descritor de arquivo).AVISO LEGAL: Eu não removi a lista "incluir", ela foi rapidamente cortada em conjunto para provar um argumento.
fonte