Linux命令-xlsatoms(列出 X11 内部原子)
Linux命令-xlsatoms(列出 X11 内部原子)
- 🔰 简介
- 📖 语法
- ⚙️ 选项
- 💡 示例
- 示例 1:列出 Atom 并理解其分类
- 示例 2:按名称搜索特定 Atom
- 示例 3:按 ID 范围查询 Atom
- 示例 4:X11 剪贴板调试实战
- 示例 5:Atom 在 X11 编程中的应用
- ⚠️ 注意
- 📚 相关命令
- 📝 总结
快速参考:xlsatoms是列出 X11 服务器内部原子(Atom)的工具。Atom 是 X11 协议中的命名整数常量,用于高效地在客户端和服务器之间传递属性名、协议类型和选择标识。xlsatoms是 X11 调试和开发的重要辅助命令。
Atom 是 X11 协议的性能优化机制——用整数 ID 替代字符串比较。理解 Atom 对于X11 应用开发、剪贴板调试、窗口管理器配置非常有用。
🔰 简介
在 X11 系统中,客户端频繁需要引用字符串标识符(如属性名_NET_WM_NAME、剪贴板类型CLIPBOARD、拖放协议XdndSelection)。如果每次都用字符串比较,效率极低。X 服务器内部将每个首次出现的字符串注册为一个唯一的整数 ID——这就是Atom。
xlsatoms让你查看当前 X 服务器中注册了哪些 Atom。这对以下场景特别有用:
- 调试 X11 应用:检查某个属性名是否已注册
- 理解剪贴板机制:查看
PRIMARY、CLIPBOARD、TARGETS等选择 Atom - 窗口管理器开发:了解
_NET_WM_*系列扩展窗口属性 - X11 安全审计:检查异常的 Atom 注册
安装方式:
# Debian/Ubuntu$sudoapt-getinstallx11-utils# RHEL/CentOS/Fedora$sudoyuminstallxorg-x11-utils# RHEL 7$sudodnfinstallxorg-x11-utils# Fedora / RHEL 8+# 验证安装$whichxlsatoms /usr/bin/xlsatoms📖 语法
xlsatoms[选项][模式]⚙️ 选项
| 选项 | 说明 |
|---|---|
-display 显示器 | 指定 X 显示器(默认$DISPLAY,如:0) |
-format 格式 | 输出格式:%d十进制 Atom ID,%x十六进制,%sAtom 名称 |
-name 名称 | 列出指定名称的 Atom |
-range 起始[-结束] | 列出指定 ID 范围的 Atom(如-range 1-100) |
💡 示例
示例 1:列出 Atom 并理解其分类
# 列出所有 Atom(数量可能很多,通常数百个)$ xlsatoms|head-201PRIMARY2SECONDARY3ARC4ATOM5BITMAP6CARDINAL7COLORMAP8CURSOR9CUT_BUFFER010CUT_BUFFER111CUT_BUFFER212CUT_BUFFER313CUT_BUFFER414CUT_BUFFER515CUT_BUFFER616CUT_BUFFER717DRAWABLE18FONT19INTEGER20PIXMAP# Atom 按来源分类:# ID 1-68: 预定义标准 Atom(每个 X 服务器都有)# ID 69+: 动态注册 Atom(由客户端应用程序创建)# 列出所有 Atom 并统计总数$ xlsatoms|wc-l324# 预期输出:当前 X 服务器注册了 324 个 Atom(数量因桌面环境而异)示例 2:按名称搜索特定 Atom
# 查看剪贴板相关的 Atom$ xlsatoms|grep-iclip255CLIPBOARD447CLIPBOARD_MANAGER628CLIPBOARD_TEMPORARY# 查看窗口管理器属性(_NET_WM 系列)$ xlsatoms|grep_NET_WM173_NET_WM_CM_S0256_NET_WM_NAME257_NET_WM_ICON_NAME258_NET_WM_VISIBLE_NAME259_NET_WM_ICON_VISIBLE_NAME260_NET_WM_DESKTOP261_NET_WM_WINDOW_TYPE262_NET_WM_STATE263_NET_WM_ALLOWED_ACTIONS264_NET_WM_STRUT265_NET_WM_STRUT_PARTIAL266_NET_WM_ICON_GEOMETRY267_NET_WM_ICON268_NET_WM_PID269_NET_WM_HANDLED_ICONS# 按名称精确查找$ xlsatoms-nameCLIPBOARD255CLIPBOARD# 查看拖放协议 Atom(Xdnd 系列)$ xlsatoms|grep-idnd458XdndSelection459XdndAware460XdndEnter461XdndLeave462XdndPosition463XdndStatus464XdndActionCopy465XdndActionMove466XdndActionLink467XdndActionAsk468XdndActionPrivate469XdndTypeList470XdndDrop471XdndFinished472XdndProxy# 预期输出:快速定位特定 Atom 的名称和 ID示例 3:按 ID 范围查询 Atom
# 查看标准预定义 Atom(ID 1-68)$ xlsatoms-range1-681PRIMARY2SECONDARY3ARC...67TEXT68COMPOUND_TEXT# 查看自定义 Atom 范围(通常从更高 ID 开始)$ xlsatoms-range100-150100_XSETTINGS_SETTINGS...150_NET_SUPPORTED# 使用不同输出格式$ xlsatoms-format'%x\t%s'-range1-5 0x1 PRIMARY 0x2 SECONDARY 0x3 ARC 0x4 ATOM 0x5 BITMAP# %d = 十进制 ID,%x = 十六进制 ID,%s = Atom 名称$ xlsatoms-format'%x => %s'-nameCLIPBOARD 0xff=>CLIPBOARD# 预期输出:灵活的格式化输出,适合脚本解析示例 4:X11 剪贴板调试实战
#!/bin/bash# X11 剪贴板原子诊断脚本echo"=== X11 剪贴板相关 Atom ==="echo""# 列出所有选择/剪贴板 Atomecho"--- 选择 Atom ---"xlsatoms|grep-E'^(PRIMARY|SECONDARY|CLIPBOARD)\b'echo""echo"--- 目标 Atom(TARGETS)---"xlsatoms-nameTARGETS xlsatoms-nameMULTIPLE xlsatoms-nameTIMESTAMPecho""# 检查剪贴板管理器echo"--- 剪贴板管理器状态 ---"CLIP_MGR=$(xlsatoms-nameCLIPBOARD_MANAGER2>/dev/null)if[-n"$CLIP_MGR"];thenecho"剪贴板管理器 Atom 已注册:$CLIP_MGR"elseecho"剪贴板管理器 Atom 未注册"fiecho""# 检查拖放协议echo"--- 拖放协议 Atom ---"xlsatoms|grep'^Xdnd'|head-5echo""# 检查窗口管理器echo"--- 窗口管理器检查 ---"ifxlsatoms-name_NET_WM_CM_S0>/dev/null2>&1;thenecho"合成窗口管理器(compositor): ✅ 已检测"elseecho"合成窗口管理器: ❌ 未检测"fi# 列出自定义/扩展 Atom 数量TOTAL=$(xlsatoms|wc-l)STD=68CUSTOM=$((TOTAL-STD))echo""echo"=== Atom 统计 ==="echo"标准预定义 Atom:$STD"echo"动态注册 Atom:$CUSTOM"echo"Atom 总数:$TOTAL"# 预期输出:# === X11 剪贴板相关 Atom ===# --- 选择 Atom ---# 1 PRIMARY# 2 SECONDARY# 255 CLIPBOARD# --- 目标 Atom(TARGETS)---# 48 TARGETS# 49 MULTIPLE# 50 TIMESTAMP# --- 窗口管理器检查 ---# 合成窗口管理器: ✅ 已检测# === Atom 统计 ===# 标准预定义 Atom: 68# 动态注册 Atom: 256# Atom 总数: 324示例 5:Atom 在 X11 编程中的应用
# Atom 用于属性操作的实际场景# 使用 xprop 查看窗口属性(属性名就是 Atom)# 查看根窗口属性$ xprop-root|head-20_NET_SUPPORTING_WM_CHECK(WINDOW): windowid# 0x600001_NET_SUPPORTED(ATOM)=_NET_WM_NAME, _NET_WM_ICON_NAME,... _NET_CLIENT_LIST(WINDOW): windowid# 0x4000001, 0x4000002_NET_ACTIVE_WINDOW(WINDOW): windowid# 0x4000001_NET_WORKAREA(CARDINAL)=0,0,1920,1040# 验证属性名对应的 Atom ID$echo"_NET_WM_NAME"|whilereadprop;doxlsatoms-name"$prop"done256_NET_WM_NAME# 剪贴板数据格式 Atom$ xlsatoms|grep-E'^(UTF8_STRING|STRING|text/plain|text/uri-list)'31STRING69UTF8_STRING# 这些 Atom 代表剪贴板中数据的 MIME 类型⚠️ 注意
Atom 的持久性和生命周期:
- Atom 是 X 服务器级别的资源,一旦注册就持续到 X 服务器关闭。即使创建 Atom 的客户端退出,Atom 仍然存在。
- 不同 X 显示器的 Atom 空间独立:
:0和:1的 Atom 表不共享。使用-display :1查看其他显示。 - Atom ID 是可回收的:X 服务器实现可能重用已释放的 Atom ID,不要假设特定 ID 永远对应同一名称。
- Atom 名称的长度限制为255 字节,这是 X11 协议硬限制。
xlsatoms的输出可能在桌面环境中非常大(例如 GNOME 注册超过 500+ Atom),输出通常不需要全部阅读,配合grep按需查询即可。
📚 相关命令
| 命令 | 说明 |
|---|---|
xprop | 查看和设置 X 窗口属性(属性名即 Atom) |
xlsclients | 列出当前 X 显示器上的客户端应用 |
xdpyinfo | 显示 X 服务器综合信息 |
xclip | 命令行操作 X 剪贴板 |
xsel | X 选择操作工具(xclip 的替代方案) |
xev | 监视 X 事件(调试窗口事件) |
xwininfo | 获取窗口详细信息 |
📝 总结
xlsatoms是一个看似简单但内涵丰富的 X11 工具,它展示了 X 协议的内部工作机制:
- Atom 是 X11 的"全局命名空间":将字符串映射为整数 ID,实现高效属性通信
- 剪贴板机制依赖 Atom:
PRIMARY、CLIPBOARD、TARGETS、UTF8_STRING等 Atom 定义了剪贴板协议 - 窗口管理器通过 Atom 通信:
_NET_WM_*系列 Atom 是现代窗口管理器的标准协议 - 调试利器:排查剪贴板问题、拖放失效、窗口属性异常时,
xlsatoms | grep是第一步
虽然日常用户很少直接使用 xlsatoms,但对于 X11 开发者、桌面环境定制者和问题排查者来说,它是理解 X Window 系统底层协议的重要窗口。
