/ proc / número do link PID / fd / X

32

No Linux, em /proc/PID/fd/X , os links para descritores de arquivos que são pipes ou soquetes têm um número, como:

l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 -> socket:[3142930]
lrwx------ 1 user user 64 Mar 24 00:05 8 -> socket:[3142932]
lr-x------ 1 user user 64 Mar 24 00:05 9 -> pipe:[9837788]

Como na primeira linha: 6839. Qual é o número que representa?

    
por Thanatos 24.03.2011 / 18:46

2 respostas

31

Esse é o número inode do canal ou soquete em questão.

Um canal é um canal unidirecional, com uma extremidade de gravação e uma final de leitura. No seu exemplo, parece que o FD 5 e o FD 6 estão conversando entre si, já que os números de inode são os mesmos. (Talvez não, no entanto. Veja abaixo.)

Mais comum do que ver um programa falando sozinho em um canal é um par de programas separados conversando entre si, normalmente porque você configura um canal entre eles com um shell:

shell-1$ ls -lR / | less

Em seguida, em outra janela de terminal:

shell-2$ ...find the ls and less PIDs with ps; say 4242 and 4243 for this example...
shell-2$ ls -l /proc/4242/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 1 -> pipe:[222536390]
shell-2$ ls -l /proc/4243/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 0 -> pipe:[222536390]

Isso diz que a saída padrão do PID 4242 (FD 1, por convenção) é conectada a um tubo com o número de inode 222536390 e que a entrada padrão do PID 4243 (FD 0) está conectada ao mesmo tubo.

Tudo isso é um longo caminho para dizer que a saída de ls está sendo enviada para a entrada de less .

Voltando ao seu exemplo, FD 1 e FD 2 são quase certamente não conversando entre si. O mais provável é que este seja o resultado da ligação entre stdout (FD 1) e stderr (FD 2), então ambos vão para o mesmo destino. Você pode fazer isso com um shell Bourne assim:

$ some-program 2>&1 | some-other-program

Portanto, se você pesquisasse em /proc/$PID_OF_SOME_OTHER_PROGRAM/fd , encontraria um terceiro FD anexado a um canal com o mesmo número de inode que está anexado aos FDs 1 e 2 para a instância some-program . Isso também pode ser o que está acontecendo com os FDs 5 e 6 em seu exemplo, mas não tenho uma teoria pronta sobre como esses dois FDs ficaram ligados. Você precisa saber o que o programa está fazendo internamente para descobrir isso.

    
por 24.03.2011 / 19:40
31

Para soquetes, você pode encontrar mais informações sobre o inode em /proc/net/tcp , /proc/net/udp ou /proc/net/unix . Por exemplo:

ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]

Nós vemos que o inode é 53710569.

head -n1 < tcp ; grep -a 53710569 tcp
sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                   
155: 0100007F:001B 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0        0 53710569 1 ffff88011f52c200 300 0 0 2 -1

Neste caso, este é um soquete de escuta (sem endereço remoto), escutando na porta local 27 (0x1B). Endereços IP são 4 bytes em hexadecimais em "notação de rede", você pode usar a função inet_ntoa para convertê-lo para a notação padrão a.b.c.d (127.0.0.1 neste caso).

Observe que esses arquivos parecem ter 0 bytes, mas têm conteúdo se você os ler. Observe também que -a é necessário com o grep, pois eles podem (por exemplo, com unix ) parecerem binários.

    
por 26.05.2012 / 22:14