Escrevendo e lendo do descritor de arquivo 3 e / proc

0

Quando eu executo o seguinte comando:

exec 3<<< "TEST"

Posso ver o seguinte em /proc (observe a última linha em relação à leitura de FD3 excluída):

# ls -al /proc/$$/fd
total 0
dr-x------ 2 root root  0 Jan 18 21:09 .
dr-xr-xr-x 9 root root  0 Jan 18 21:09 ..
lrwx------ 1 root root 64 Jan 28 16:22 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 28 16:22 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 18 21:09 2 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 28 16:22 255 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 28 20:42 3 -> /tmp/sh-thd-1123912022914878506 (deleted)

E eu posso ler o conteúdo do FD 3 uma vez, mas não depois:

# cat 0<&3
TEST
# cat 0<&3
# cat 0<&3

Minha pergunta é se em /proc/$$/fd/3 já estava lendo como "excluído", qual é a teoria por trás da qual eu ainda posso ler seu conteúdo?

    
por Wadih M. 29.01.2017 / 02:50

3 respostas

1

Você ainda pode ler o descritor de arquivo. O problema é que você está usando a chamada de sistema "dup2" para fazer uma segunda referência a um descritor de arquivo, e um descritor de arquivo tem uma posição. Depois do primeiro gato, a posição está no final dos dados. Você pode ler os dados um pouco de cada vez (aqui eu uso read como exemplo para ler uma linha de cada vez, normalmente você usaria ler -r), e estou usando perl como uma maneira fácil de retroceder a posição para o início do arquivo.

 $ exec 3<<<'This is some text
 > and some more
 > that is all folks'
 $ read <&3 ; echo "$REPLY"
 This is some text
 $ read <&3 ; echo "$REPLY"
 and some more
 $ perl -e 'sysseek(stdin,0,0);' <&3
 $ read <&3 ; echo "$REPLY"
 This is some text
    
por 29.01.2017 / 03:48
0

Você não fechou o descritor de arquivo, portanto, não liberou seus recursos. Você, no entanto, leu tudo o que será disponibilizado nesse descritor de arquivo. Futuras leituras irão imediatamente receber um EOF, mas o descritor de arquivo não foi fechado, então ainda existe.

    
por 29.01.2017 / 03:33
0

Um arquivo é "excluído" quando não há mais entrada de diretório apontando para esse arquivo. É possível que um arquivo seja excluído nesse sentido, mas ainda exista no disco. O inode do arquivo, bem como o conteúdo do arquivo, não são excluídos até que o arquivo seja fechado.

Quando um arquivo não tem entrada de diretório, não há como abri-lo diretamente. No entanto, ainda é possível duplicar os descritores existentes para esse arquivo, que é o redirecionamento em /proc/PID/fd/FD .

Se o sistema travar com o arquivo ainda aberto, mas excluído, os dados serão excluídos mais tarde: na próxima inicialização, quando a revista for reproduzida, ou por fsck quando detecta um arquivo com uma contagem de links igual a 0.

    
por 30.01.2017 / 01:57