/proc/PID/fd/X номер канала

Для большей части использования универсальные ядра хороши для фактически любых аппаратных средств. Дополнительно они обычно содержат (редактор), определенные для распределения патчи, настолько компилирующие Ваше собственное ядро, могут (мог) бы вызвать проблемы.

Причина скомпилировать Ваше собственное ядро:

  • Вы используете основанный на источнике дистрибутив, таким образом, нет никакого 'универсального' ядра
  • Вы - разработчик ядра, и Вы разрабатываете ядро
  • Необходимо настроить ядро, например, для встроенного устройства с очень ограниченным жестким диском
  • Некоторый драйвер не компилируется в (очень редком случае)
  • Вы хотите исправить ядро, И Вы знаете то, что Вы делаете
  • Вы хотите изучить, как скомпилировать ядро

Если бы я не использовал основанный на источнике дистрибутив, то я не скомпилировал бы ядро вообще.

37
14.09.2012, 03:28
2 ответа

Это - inode число для канала или рассматриваемого сокета.

Канал является однонаправленным каналом с концом записи и концом чтения. В Вашем примере похоже, что FD 5 и FD 6 говорят друг с другом, так как inode числа являются тем же. (Возможно, не, все же. Посмотрите ниже.)

Более распространенный, чем наблюдение программы, говорящей с собой по каналу, пара отдельных программ, говорящих друг с другом, обычно потому что Вы настраиваете канал между ними с оболочкой:

shell-1$ ls -lR / | less

Затем в другом окне терминала:

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]

Это говорит, что стандартный вывод 4242 PID (FD 1, условно) подключен к каналу с inode номером 222536390, и что вход стандарта 4243 PID (FD 0) подключен к тому же каналу.

Весь из которого является длинным путем сказать это lsвывод отправляется в lessвход.

Возвращаясь к Вашему примеру, FD 1 и FD 2 почти наверняка не говорят друг с другом. Скорее всего, это - результат связи stdout (FD 1) и stderr (FD 2) вместе, таким образом, они оба переходят к тому же месту назначения. Можно сделать это с Оболочкой Bourne как это:

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

Так, если Вы ввели по абсолютному адресу вокруг в /proc/$PID_OF_SOME_OTHER_PROGRAM/fd, Вы прилагается бы третий фарадей к каналу с тем же inode числом, как присоединен к FDs 1 и 2 для some-program экземпляр. Это может также быть тем, что происходит с FDs 5 и 6 в Вашем примере, но у меня нет готовой теории, как эти два FDs были связаны. Необходимо было бы знать то, что программа делает внутренне для понимания этого.

36
27.01.2020, 19:36
  • 1
    Пример, я думаю, был pidgin - это имело много каналов и сокетов и другого материала, хороший пример - также. Один последний вопрос: inodes конкретны только в контексте конкретной файловой системы, корректны? Как в, у меня мог быть inode 3 на моем / файловая система и другой (другой) inode 3 на моем /boot файловая система. –  Thanatos 24.03.2011, 23:25
  • 2
    Да. В случае /proc файловая система, inode числа просто составлены на лету (см. get_next_ino() в fs/inode.c в ядре), запускающийся от 0, когда система недавно загружается. Механизм, который составляет их, совместно используется несколькими из impersistent файловых систем Linux (proc, configfs, ramfs, autofs...), среди которого inode числа уникальны даже при том, что семантика POSIX не требует это. Это - довольно особый случай, как бы то ни было. На правило, о котором Вы говорите, обычно ссылаются в связи с нормальными персистентными файловыми системами как ext3. –  Warren Young 25.03.2011, 00:04

Для сокетов можно найти больше информации о inode в /proc/net/tcp, /proc/net/udp или /proc/net/unix. Например:

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

Мы видим, что 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

В этом случае это - сокет слушания (никакой удаленный адрес), слушая на локальном порте 27 (0x1B). IP-адреса составляют 4 байта в шестнадцатеричном числе в "сетевой нотации", можно использовать inet_ntoa функционируйте для преобразования его в стандарт a.b.c.d нотация (127.0.0.1 в этом случае).

Обратите внимание, что эти файлы, кажется, составляют 0 байтов, но иметь содержание при чтении их. Также отметьте это -a требуется с grep, так как они могут (например, с unix) кажись, быть двоичными.

33
27.01.2020, 19:36
  • 1
    Существует также /proc/net/tcp6 и /proc/net/udp6 для IPv6. –  Craig McQueen 19.05.2016, 10:49

Теги

Похожие вопросы