Esse é o número do inode para o tubo ou soquete em questão.
Um canal é um canal unidirecional, com um final de gravação e um final de leitura. No seu exemplo, parece que o FD 5 e o FD 6 estão conversando entre si, pois os números dos inodes são os mesmos. (Talvez não, no entanto. Veja abaixo.)
Mais comum do que ver um programa conversando consigo mesmo através de 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 outra janela do 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 indica que a saída padrão do PID 4242 (FD 1, por convenção) está conectada a um tubo com número de inodo 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 ls
a saída está sendo enviada para less
a entrada da.
Voltando ao seu exemplo, o FD 1 e o FD 2 quase certamente não estão se falando. Provavelmente, este é o resultado de vincular stdout (FD 1) e stderr (FD 2) juntos, para que ambos vão para o mesmo destino. Você pode fazer isso com um shell Bourne como este:
$ some-program 2>&1 | some-other-program
Portanto, se você bisbilhotasse /proc/$PID_OF_SOME_OTHER_PROGRAM/fd
, encontraria um terceiro FD anexado a um tubo com o mesmo número de inode que é anexado aos FDs 1 e 2 da some-program
instância. Também pode ser o que está acontecendo com os FDs 5 e 6 no seu exemplo, mas não tenho uma teoria pronta sobre como esses dois FDs se uniram. Você precisaria saber o que o programa está fazendo internamente para descobrir isso.
pidgin
- tinha muitos canos e tomadas e outras coisas, então era um bom exemplo. Uma última pergunta: os inodes são específicos apenas no contexto de um sistema de arquivos específico, correto? Como em, eu poderia ter o inode 3 no meu/
sistema de arquivos e outro (diferente) inode 3 no meu/boot
sistema de arquivos./proc
sistema de arquivos, os números dos inodes são criados em tempo real (vejaget_next_ino()
nofs/inode.c
kernel), começando em 0 quando o sistema é inicializado novamente. O mecanismo que os compõe é compartilhado por vários sistemas de arquivos impersistentes do Linux (proc, configfs, ramfs, autofs ...), entre os quais os números de inode são únicos, mesmo que a semântica do POSIX não exija. Esse é um caso bastante especial, no entanto. A regra da qual você está falando é normalmente referenciada em conexão com sistemas de arquivos persistentes normais como ext3.Para soquetes, você pode encontrar mais informações sobre o inode in
/proc/net/tcp
,/proc/net/udp
ou/proc/net/unix
. Por exemplo:Vemos inode é 53710569.
Nesse caso, este é um soquete de escuta (sem endereço remoto), escutando na porta local 27 (0x1B). Os endereços IP são 4 bytes em hexadecimal em "notação de rede"; você pode usar a
inet_ntoa
função para convertê-lo em notação abcd padrão (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 isso
-a
é necessário com o grep, pois eles podem (por exemplo, comunix
) parecer binários.fonte
/proc/net/tcp6
e/proc/net/udp6
para IPv6.