4

Последние 2 строки lsof -i показаны ниже. Что это такое? Я использую OpenSuse LEAP 42.2.

Web\x20Co 7066 user1   38u  IPv4  76006      0t0  UDP *:43756 
Web\x20Co 7066 user1   39u  IPv6  76008      0t0  UDP *:46834

2 ответа2

3

Строка \x20 в первом столбце является шестнадцатеричным значением для символа ASCII, в данном случае это пробел. Форматирование вывода, используемое lsof, описано на справочной странице lsof.

Lsof only outputs printable (declared so by isprint(3)) 8 bit characters.  Non-printable characters are printed in one of three forms: the  C  ``\[bfrnt]''  form;  the
   control  character `^' form (e.g., ``^@''); or hexadecimal leading ``\x'' form (e.g., ``\xab'').  Space is non-printable in the COMMAND column (``\x20'') and printable
   elsewhere.

Страница man описывает, что для столбца COMMAND (показанного слева в примере вывода) символ пробела обрабатывается как непечатный.

1

\x20 это пробел.

\x20 это пробел " ».
Шестнадцатеричный префикс \x является одним из 3 способов печати lsof непечатных символов.
Пробел в таблице ASCII имеет значение 32 в десятичной системе счисления, 20 в шестнадцатеричном и 040 окт.

Как правило, только символы со восьмеричным значением ASCII в пределах 040 и 176 считаются "печатными" для isprint [ isprint ] (см. Таблицу). В десятичном виде включены символы в пределах [32-126].

Интересно отметить, что пробел является печатным символом для isprint [ isprint, isprint C++ ], даже если он не имеет графического представления [*] и часто используется в качестве разделителя полей.

Следовательно, в человеке мы находим дополнительную строку только для пробела [ 1 ] и в столбце КОМАНДА:

Lsof выводит только печатаемые (объявленные так isprint (3)) 8-битные символы.
Непечатные символы печатаются в одной из трех форм:

  • форма C '\[bfrnt]';
  • форма управляющего символа `^ '(например,` `^ @' ');
  • или шестнадцатеричная ведущая форма '\x' (например, ``\xab '').

Пробел нельзя распечатать в столбце КОМАНДА (`\x20 ') и распечатать в другом месте.

(отступ и жирный шрифт мои)

Почему пробел не печатается?

Здесь интересно узнать, почему он считается «не для печати».
По соображениям безопасности, как мы можем прочитать из FAQ [ 2 ]:

14.5.1 Почему пробел считается непечатаемым символом в именах команд?

Space is considered an unprintable character in command
names because it is sometimes possible to hide the full
command name from scripts that parse ps(1) output by
embedding a space in the name.

Еще несколько слов

Если вас раздражает этот вывод, вы можете прочитать раздел ВЫХОД ДЛЯ ДРУГИХ ПРОГРАММ lsof man и опции -F :

Когда указана опция -F, lsof создает вывод, который подходит для обработки другой программой - например, скриптом awk или Perl или программой на языке Си.
...


[*] Примечание: существует другая функция с именем isgraph [ isgraph C++ ], которая проверяет, является ли символ c графическим представлением, но практически отвечает true для всех тех символов, которые могут быть напечатаны (например, isprint), кроме символа пробела.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .