跟踪/系统调用"Print Screen"进程

Trace/syscalls the "Print Screen" process

本文关键字:Screen 进程 Print 跟踪 系统调用      更新时间:2023-10-16

这是上下文:我正在运行Debian GNU/Linux,并且我与桌面环境定期切换(下一个为"DE")
我的问题很简单:我想知道当我按下键盘键"打印屏幕"时使用了哪些操作、系统调用甚至函数。

DE会改变方式吗?例如,Mate、Gnome、KDE、LXDE或Xfce(等)是否使用了自己代码的特定调用,或者是否存在通用系统调用?

我认为答案(如果有的话)不是Debian的亲戚,而是更多的X或Wayland,不是吗?

提前感谢您的建议和回答:)

PS:我准确地说,我读了Xlib源代码的一大部分,但没有发现有用的东西。

打印屏幕本身肯定不是系统调用,但获得按键的内核守护进程肯定会导致执行一个使用您称之为"系统调用"的例程,这意味着不会有任何对内核的系统调用,因为你已经在那里了(除非窗口管理器实际上在用户空间运行,这对Mac OSX或windows来说不是真的,我假设对linux也是如此)。

它是如何工作的?它的工作原理可能是从屏幕缓冲区(ram的DMA区域)复制当前显示,然后将像素表示转换为位图。

基本原理可以在xwd工具中找到。

代码读起来没那么糟糕。在简单的场景中,它使用了XGetImage,但如果屏幕有多个视觉区域,它会变得更复杂,但基本原理是使用XGetPixel来获得屏幕像素,使用XPutPixel来存储在临时图像中。

按下PrtScrn时发生的情况是一样的,只是可能是其他应用程序启动了。具体的应用程序取决于发行版中的图形包(Gnome、KDE、Unity等)。但在内部,他们会做一些非常相似的事情。

编辑:

正如Peter所指出的,如果窗口系统是"合成"的(也就是说,每个窗口都在屏幕外绘制自己的内容,图形硬件通过合成来组合输出),那么屏幕捕获就需要要求合成系统在屏幕外渲染输出,然后复制它。