如何将 X11 窗口 ID 转换为进程 ID

2024-05-17

我正在开发一个小型应用程序,需要在给定主窗口或子窗口的 X11 窗口 ID 的情况下找到进程的 PID。我看到了使用进行此类转换的示例_NET_WM_PID,但我不知道如何在不使用它的情况下做到这一点。不使用的原因_NET_WM_PID是它没有在所有可用的窗口管理器中实现,我的应用程序需要在其中任何一个(或至少在大多数窗口管理器上)上工作。有人可以帮助我并给我一些关于如何解决这个问题的建议/指示吗?谢谢你!


除非你的X服务器支持XResQueryClientIds from X-Resource v1.2 扩展 http://www.x.org/releases/X11R7.7/doc/resourceproto/resproto.txt我知道没有easy way to reliably请求进程ID。不过还有其他方法。

如果您面前只有一个窗口并且还不知道它的 ID,那么很容易找到它。只需打开相关窗口旁边的终端,然后运行xwininfo在那里并单击该窗口。xwininfo将显示窗口 ID。

因此,我们假设您知道一个窗口 ID,例如0x1600045,想找到拥有它的进程是什么。

检查该窗口属于谁的最简单方法是为其运行 XKillClient,即:

xkill -id 0x1600045

看看哪个进程刚刚死掉了。当然,如果你不介意去死的话。

另一种简单但不可靠的方法是检查其_NET_WM_PID and WM_CLIENT_MACHINE特性:

xprop -id 0x1600045

这就是工具之类的xlsclients and xrestop http://www.freedesktop.org/wiki/Software/xrestop/ do.

不幸的是,这些信息可能不正确,不仅因为该过程是邪恶的并改变了这些,而且还因为它有错误。例如,在一些 Firefox 崩溃/重新启动后,我看到了孤立的窗口(我猜是来自 flash 插件)_NET_WM_PID指向一个很久以前就死掉的进程。

另一种方法是运行

xwininfo -root -tree

并检查相关窗口的父窗口的属性。这也可能会给您一些有关窗口起源的提示。

但!虽然您可能找不到哪个进程创建了该窗口,但仍然有一种方法可以找到该进程从何处连接到 X-server。这种方式适用于真正的黑客。 :)

您所知道的窗口 ID 0x1600045 的低位清零(即 0x1600000)是“客户端基础”。为该客户端分配的所有资源 ID 都是“基于”它的(0x1600001、0x1600002、0x1600003 等)。 X-server 在 client[] 数组中存储有关其客户端的信息,并且对于每个客户端,其“基础”存储在 client[i]->clientAsMask 变量中。要找到与该客户端对应的 X-socket,您需要使用以下命令连接到 X-servergdb,遍历clients[]数组,找到clientclientAsMask并打印其套接字描述符,存储在 ((OsCommPtr)(clients[i]->osPrivate))->fd 中。

可能有很多X客户端连接,所以为了不手动检查它们,让我们使用gdb函数:

define findclient
  set $ii = 0
  while ($ii < currentMaxClients)
    if (clients[$ii] != 0 && clients[$ii]->clientAsMask == $arg0 && clients[$ii]->osPrivate != 0)
      print ((OsCommPtr)(clients[$ii]->osPrivate))->fd
    end
    set $ii = $ii + 1
  end
end

当找到套接字时,您可以检查谁连接到它,并最终找到进程。

WARNING:不要从 X 服务器内部将 gdb 连接到 X 服务器。 gdb 会挂起它附加的进程,因此如果您从 X-session 内部附加它,您将冻结您的 X-server 并且无法与 gdb 交互。您必须切换到文本终端(Ctrl+Alt+F2)或通过 ssh 连接到您的计算机。

Example:

  1. 找到你的 X 服务器的 PID:

    $ ps ax | grep X
     1237 tty1     Ssl+  11:36 /usr/bin/X :0 vt1 -nr -nolisten tcp -auth /var/run/kdm/A:0-h6syCa
    
  2. 窗口 ID 为 0x1600045,因此客户端基数为 0x1600000。连接到 X 服务器并查找该客户端库的客户端套接字描述符。您将需要调试信息 为 X-server 安装(-debuginfo 软件包用于 rpm-distributions 或 -dbg 软件包用于 deb)。

    $ sudo gdb
    (gdb) define findclient
    Type commands for definition of "findclient".
    End with a line saying just "end".
    >  set $ii = 0
    >  while ($ii < currentMaxClients)
     >   if (clients[$ii] != 0 && clients[$ii]->clientAsMask == $arg0 && clients[$ii]->osPrivate != 0)
      >     print ((OsCommPtr)(clients[$ii]->osPrivate))->fd
      >     end
     >   set $ii = $ii + 1
     >   end
    >  end
    (gdb) attach 1237
    (gdb) findclient 0x1600000
    $1 = 31
    (gdb) detach
    (gdb) quit
    
  3. 现在您知道客户端已连接到服务器套接字 31。使用lsof查找该套接字是什么:

    $ sudo lsof -n | grep 1237 | grep 31
    X        1237    root   31u   unix 0xffff810008339340       8512422 socket
    

    (这里“X”是进程名称,“1237”是它的pid,“root”是它运行的用户,“31u”是套接字描述符)

    在那里你可能会看到客户端是通过 TCP 连接的,然后你可以转到它连接的机器并检查netstat -nap在那里找到进程。但很可能您会在那里看到一个 unix 套接字,如上所示,这意味着它是本地客户端。

  4. 要为该 unix 套接字找到一对,您可以使用MvG的技术 https://serverfault.com/a/417946(您还需要安装的内核的调试信息):

    $ sudo gdb -c /proc/kcore
    (gdb) print ((struct unix_sock*)0xffff810008339340)->peer
    $1 = (struct sock *) 0xffff810008339600
    (gdb) quit
    
  5. 现在您已经了解了客户端套接字,请使用lsof找到持有它的PID:

    $ sudo lsof -n | grep 0xffff810008339600
    firefox  7725  username  146u   unix 0xffff810008339600       8512421 socket
    

就是这样。保留该窗口的进程是“firefox”,进程 ID 为 7725

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 X11 窗口 ID 转换为进程 ID 的相关文章

  • VTK 与真实 X 一起工作,与 Xvfb 一起崩溃

    我正在调试一个第 3 方 Python 脚本 该脚本使用 VTK 库实现无头图像处理 当使用常规 X 窗口会话运行时 它会按预期工作 窗口会瞬间闪烁 当针对 Xvfb 内存中的虚拟帧缓冲区 运行时 它会崩溃 脚本是这样的 省略了一些废话 i
  • 帮助:达到最大客户端数 - 分段错误

    我想模拟很多按键事件 我通过使用找到了解决方案XTestFakeKeyEvent 但是当我模拟超过 210 次时 我的程序会引发 已达到最大客户端数 分段错误 我不知道如何解决这个问题 我的代码在这里 include
  • 发送 X11 点击事件不适用于某些窗口

    以下代码片段在大多数情况下都有效 除了在某些窗口中 例如 在最新的 Ubuntu 下 它无法在文件资源管理器中选择文件夹 它似乎在其他地方都适用 但这个差距是巨大的 我怀疑这与我使用 XQueryPointer 的方式有关 但我已经尝试了几
  • 如何将 X11 键符号映射到 Unicode 字符?

    X11 将键码映射到键符号 然后将键符号映射到 Unicode 在程序中检索键符号到 Unicode 映射的好方法是什么 Try this http www cl cam ac uk mgk25 ucs keysym2ucs c
  • 如何在Linux中做一个假的鼠标滚轮移动

    我正在尝试模拟键盘和鼠标事件 我已经成功制作了假键盘 keydown keyup 假鼠标按钮按下 向上和假鼠标移动 但我没有找到如何做假鼠标滚轮移动 有人可以向我解释一个在 C 中执行此操作的简单方法吗 鼠标移动和鼠标按钮按下 Displa
  • XInitThreads() 的缺点是什么?

    I know XInitThreads 将允许我从主线程以外的线程调用 X 服务器 如果我想使 Xlib 中的并发线程支持是必要的使用 Qt 从辅助线程调用 OpenGL http doc qt digia com qq qq06 glim
  • 使用 PyCharm 在远程服务器上进行 Python 绘图

    我已经开始学习 Python 到目前为止我的设置一直遵循 在 Win10 64 位本地计算机上安装 Python 3 5 并使用 PyCharm 作为一个很棒的 IDE 一切正常 matplotlib 图表和其他可视化输出显示良好 调试工作
  • 无法让 XCreateSimpleWindow 在正确位置打开窗口

    以下代码打开一个大小正确的窗口 w h 但位置不正确 x y include
  • 检测 X11 根窗口中的修改键释放

    总体目标就像 Windows 的 Alt Tab 所以我将使用这些键进行解释 我想 按 Alt gt 按 Tab gt 弹出窗口出现 gt 按住 Alt 的任何时候按 Tab gt 释放 Alt gt 弹出窗口消失 我无法检测到最终的 Al
  • QWidget / X11:防止通过鼠标单击激活/聚焦窗口

    我想用 Qt QML 开发一个系统范围的屏幕键盘 通过 xlib 注入按键事件效果很好 我现在的问题 如果单击键盘按钮 具有所选输入字段的窗口将失去焦点 因此 按键事件将不会传递到先前选择的输入字段 那么有人知道如何防止 QWidget 被
  • 如何避免 Linux/X11 上的 pygame 撕裂

    我一直在玩 pygame 在 Debian Lenny 上 它似乎工作得很好 除了烦人的位图撕裂 全屏或窗口模式 我正在使用默认的 SDL X11 驱动程序 谷歌搜索表明 X11 不提供垂直同步功能 这是 SDL 的一个已知问题 即使使用使
  • 如何使用 C/C++ 获取数字锁定状态?

    我读过 Gdk 论坛链接 上面说从 3 0 版本开始就实现了获取 num lock state api 但我使用的是 2 4 版本 无法更新到 3 0 版本 因为我需要支持较低的 Linux 版本 这是讨论链接 http mail gnom
  • 如何在 Linux 上用 C++ 截取被遮挡窗口的屏幕截图

    我正在尝试弄清楚如何截取当前未聚焦的窗口的屏幕截图 因此该窗口很可能会被其他窗口部分或完全遮挡 我在此链接上找到了一个示例使用 X11 的 Xcomposite 扩展获取被覆盖 不可见或最小化的窗口的屏幕截图 https stackover
  • XTestFakeButtonEvent 和 XSendEvent 之间的区别

    我正在尝试通过 x11 为 ubuntu 编写简单的鼠标点击器 首先 我编写了单击过程的第一个变体 基于 XSendEvent include
  • Xlib XGetWindowProperty 返回零项

    我在读取某些 XWindow ICCCM 属性时遇到问题 问题实际上是当我尝试读取 NET WM STATUS 属性时 我正在使用的功能是 int get property value Display display Window wind
  • 如何开始编写合成 WM?

    我想编写一个基本的硬件加速窗口管理器 所以我一直在寻找一些有关如何开始的文档 但我只找到了本教程 http wingolog org archives 2008 07 26 so you want to build a compositor
  • X11剪贴板如何处理多种数据格式?

    这可能也发生在您身上 有时 当您将某个网页中的文本复制到您最喜欢的网络邮件客户端中的富文本电子邮件草稿中时 您不喜欢粘贴的内容piece有不同的字体 大小 粗细 它以某种方式记住样式 通常是图像 当选择时 如果您将相同的内容粘贴到您最喜欢的
  • 如何使用 XIconifyWindow 更改任务栏图标?

    我在 Linux 中编程 并在桌面上使用 X11 我想更改任务栏中最小化窗口的图像 我正在使用 Fluxbox 当用户单击最小化窗口时 我当前正在使用 XIconifyWindow 当用户最小化任务栏中的小方形图标时 如何控制它 Thank
  • X11 等待并获取剪贴板文本

    我必须监视 X11 剪贴板 目前 我每 5 秒请求一次剪贴板选择 然后对从剪贴板返回的文本进行哈希处理 并将其与上次检查的哈希计算结果进行比较 如果哈希值不相同 我会分析文本内容并做一些事情 我不喜欢我的方法 我来自Windows 使用wi
  • X 服务器使用什么像素格式?

    X 服务器使用什么像素格式 RGBA ARBG BGRA 如果有任何特定格式的话 Update 我专门寻找有关颜色分量顺序和位模式的信息 你的意思是帧缓冲区格式 或者所有支持的像素图格式 无论是哪一种 都取决于您的图形硬件 驱动程序和配置

随机推荐

  • 使用 AVFoundation 裁剪 AVAsset 视频

    我在用AVCaptureMovieFileOutput录制一些视频 我使用显示预览层AVLayerVideoGravityResizeAspectFill稍微放大 我遇到的问题是最终的视频较大 包含预览期间不适合屏幕的额外图像 这是预览和生
  • 有没有什么方法可以强制实例仅位于堆栈上?

    我有一个 C 类 我只希望它在堆栈上实例化 我正在使用 API 来访问用另一种 解释型 语言开发的内容 该语言带有自己的垃圾收集功能 这种语言中的机制足够了解 可以将它找到的引用单独保留在堆栈上的任何内容 并且由于该本机类包含这样的引用 因
  • 如何向我的网站添加 Google 搜索框?

    我正在尝试将 Google 搜索框添加到我自己的网站 我希望它搜索谷歌本身 而不是我的网站 我曾经有一些代码可以工作 但现在不再工作
  • PHP 中的 Preg_replace

    我想替换 中包含的字符串中的内容content 它是多行等 preg replace 函数应该删除整个 com 没有垫子 蒙特 尝试这个 result preg replace s replacement content subject
  • Javascript DOM setAttribute 在函数调用中不起作用

    我有一个带有输入元素的 HTML 文件 我希望向其中添加一个名为 valid fieldset011 的新属性 该属性用作 AngularJS 验证器的链接 输入元素具有属性 id fieldset011 如果我使用以下脚本 包含在脚本标签
  • Android - 当不在栏顶部时推送通知空白

    我在使用 Android 推送通知时遇到一个小问题 如果有 3 个通知 并且只有其中一个显示标题和消息 位于酒吧顶部的那个 如果有人知道可能是什么问题 请告诉我 请参阅此链接上的图像 这就是我接收通知的方式http postimg org
  • 定义 js-xlsx 单元格范围

    我正在尝试使用 js xlsx 读取 Excel 值 我可以使用以下代码从工作簿工作表中获取单元格值 if typeof require undefined XLSX require xlsx var workbook XLSX readF
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 第一次使用node.js - “ReferenceError:节点未定义”

    我刚刚安装了node js 我尝试编写应该检查版本的node v 但它不起作用 这是输出 gt node v ReferenceError node is not defined at repl 1 2 at REPLServer self
  • 如何在 Android 上创建 YouTube 的双击手势?

    我在 Android 上有 exoplayer 的应用程序 我已经创建了 youtube双击手势用动画向前或向后跳跃 10 秒 如何在双击时创建具有波纹效果的半圆 像这样 这个怎么做 我也想实现这样的功能 所以我自己编写了它来 复制 You
  • 调用 exit() 时是否运行析构函数? [复制]

    这个问题在这里已经有答案了 可能的重复 exit 或异常会阻止调用作用域结束析构函数吗 https stackoverflow com questions 2668075 will exit or an exception prevent
  • 负整数的基数排序

    我正在尝试对整数 包括负整数 实现基数排序 对于非负整数 我计划为数字0 9创建一个10个队列的队列 并实现LSD算法 但我对负整数有点困惑 我现在的想法是继续为它们创建另一个包含 10 个队列的队列 并分别对它们进行排序 然后在最后 我将
  • 嵌套字典中的 Django 模板

    我正在使用 Django 模板 并且遇到了嵌套字典的一个问题 Dict result dict type 0 file name abc count 0 type 1 file name xyz count 50 我的 HTML 文件中的模
  • 如何将 mysql 转换为 mysqli? [复制]

    这个问题在这里已经有答案了 我厌倦了将 mysql 转换为 mysqli 但似乎收到了很多错误和警告 连接到数据库没有问题 但其余代码似乎错误 我做错了什么 sql
  • 对成员“buildBlock()”的引用不明确

    我一直在尝试使用 Swift UI 为 iOS 13 制作一个应用程序 但我不断收到这个奇怪的错误 对成员 buildBlock 的引用不明确 无论我做什么 错误都不会消失 我尝试一次对代码段进行注释 以查看哪一部分可能导致了问题 但唯一有
  • Android-工具栏中的SearchView

    我只想在我的应用程序中添加 searchview 但我不想搜索任何东西 只是我想要用户输入的查询 到目前为止 我尝试了这段代码 但是当我运行我的应用程序时它崩溃了 Update 我尝试了这个 但即使我的应用程序崩溃了 main menu x
  • c# 通过内存地址调用方法

    我正在尝试在 C 中的指定内存地址调用函数 以下是我在 C 中的操作方法 typedef void do int i auto doActor do 0xAAAABEEF doActor 1 如果可能的话 如何在 C 中复制这种行为 对 C
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf
  • 如何在没有 Startup 类的情况下以编程方式启动 .NET 6 最小 API

    我正在尝试对我们的提供商项目实施 PactNet 合同测试 然而问题是 我们使用的是 Minimal API 因此我们没有将 Startup cs 和 Program cs 类全部整合到一个 Program cs 中 这提出了一个问题 因为
  • 如何将 X11 窗口 ID 转换为进程 ID

    我正在开发一个小型应用程序 需要在给定主窗口或子窗口的 X11 窗口 ID 的情况下找到进程的 PID 我看到了使用进行此类转换的示例 NET WM PID 但我不知道如何在不使用它的情况下做到这一点 不使用的原因 NET WM PID是它