File delete versus overwrite e link em / proc / pid / fd

2

É bem conhecido que os sistemas UNIX não irão realmente apagar um arquivo no disco enquanto o arquivo estiver em uso. Portanto, se um arquivo está sendo acessado pelo processo 1 e o processo 2 exclui o arquivo usando rm, o processo 1 continua a ver o arquivo; Além disso, o link do descritor de arquivo em / proc / (process 1 id) / fd informa o conteúdo original do arquivo excluído.

No entanto, se o processo 2 sobrescrever o arquivo em vez de excluí-lo (digamos com echo "abracadabra" > file.txt), o link do descritor de arquivo em / proc / (process 1 id) / fd relata o material sobrescrito ( "abracadabra"), enquanto o processo 1 ainda é capaz de acessar o conteúdo original do arquivo. Por que essa diferença?

[Editar] O trecho abaixo é em resposta a Jim Paris

>uname -a
Linux ravoori-netbook 3.2.0-32-generic-pae #51-Ubuntu SMP Wed Sep 26 21:54:23 UT
C 2012 i686 i686 i386 GNU/Linux
>echo original > /tmp/foo
>tail -0f /tmp/foo &
[2] 6144
>rm /tmp/foo
>cat /proc/6144/fd/3
original
>echo abracadabra > /tmp/foo
>cat /proc/6144/fd/3
original
    
por iruvar 17.10.2012 / 20:58

2 respostas

2

Se o processo 1 já tiver iniciado a leitura do arquivo antes do processo 2 sobrescrevê-lo, ele terá parte do conteúdo armazenado no buffer stdio . Depois de cruzar o limite do tamanho do buffer, ele será forçado a ir para o kernel e, em seguida, encontrará o novo conteúdo sobrescrito.

    
por 17.10.2012 / 22:15
2

However, if process 2 overwrites the file as opposed to deleting it (say with echo "abracadabra" > file.txt), the file descriptor link at /proc/(process 1 id)/fd reports the overwriting material("abracadabra"), while process 1 is still able to access the original contents original le.

Eu não concordo:

$ echo original > /tmp/foo
$ tail -0f /tmp/foo &
[1] 20591
$ rm /tmp/foo
$ cat /proc/20591/fd/3
original
$ echo abracadabra > /tmp/foo
$ cat /proc/20591/fd/3
original

O link fd ainda mostra o conteúdo original, ao contrário do que você reivindicou. Isso é com o Linux 3.5. Você está vendo algo diferente?

    
por 17.10.2012 / 23:28