最后两行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
答案1
第一列中的字符串\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.
手册页描述了 COMMAND 列(显示在示例输出的左侧),空格字符被视为不可打印。
答案2
是\x20
一个空格。
是\x20
空格“ ”。
十六进制前缀是打印的\x
三种方式之一lsof
不可打印字符。ASCII
表中的空格在十进制数字系统中的值为 32,20在十六进制和 040十月。
规则是,仅考虑八进制 ASCII 值在 040 至 176 之间的字符“可打印”作者 isprint [印刷](见表)。十进制中包括[32-126]内的字符。
值得注意的是,空格是isprint
[的可打印字符印刷,打印 C++],即使它没有图形表示[*]并且它经常用作字段分隔符。
因此,在男人身上,我们发现了一条补充线,专门用于空格[1]并在 COMMAND 列中:
Lsof 仅输出可打印的内容(由打印(3))8位 人物.
不可打印字符以以下三种形式之一打印:
- C '\[bfrnt]' 形式;
- 控制字符 `^' 形式(例如 ``^@'');
- 或者十六进制 领导'\X'形式(例如“\xab”)。
空格在 COMMAND 列(“\x20”)中不可打印,但在其他地方可打印。
(缩进和粗体是我的)
为什么空格是不可打印字符?
有趣的是,了解为什么它被认为“不可打印”。
这似乎是出于安全原因,正如我们从常见问题解答中看到的那样[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
和-F
选项规范:
当指定 -F 选项时,lsof 会生成适合其他程序处理的输出 - 例如 awk 或 Perl 脚本或 C 程序
。...
[*]笔记:存在另一个名为isgraph
[的函数是图 C++]检查 c 是否是一个具有图形表示的字符,但实际上对于所有可以打印(如通过 isprint)的字符(空格字符除外),答案都是真的。