xclip 追踪时不会终止

问题描述 投票:0回答:2

我做出了以下观察:

$ xclip text.txt

执行立即终止,它将

text.txt
的内容复制到默认选择
XA_PRIMARY
,这意味着您可以通过鼠标中键或
xclip -o
粘贴它。

当我想查看 xclip 正在做什么时,它不再终止:

$ xclip -verbose text.txt
Connected to X server.
Using UTF8_STRING.
Reading text.txt...
Waiting for selection requests, Control-C to quit
  Waiting for selection request number 1

直到我在 X11 系统中选择某些内容后,它才会终止,例如我粘贴到此处的输出。如果行为仅限于

verbose
,我会理解这一点。毕竟你想坐下来看看会发生什么。

我可以使用

strace
重现相同的行为,但前提是提供了 fork 选项

$ strace -f xclip text.txt

或者当使用系统执行命令从 Ruby 中 shell 时,应该返回输出,而实际上什么也没有。

$ ruby -e "`xclip text.txt`"

strace
给出的提示是,它正在轮询文件描述符以等待事件。如果我选择一些东西,这个事件就满足了。这种行为可以解释吗?我已经得到证据,这在任何系统上都无法重现。这可能与票证 #9 从 stdin 设置剪贴板时不关闭 stdout 相关吗

我正在 Ubuntu 13.04 上运行

xclip
版本 0.12。

linux unix ubuntu x11 xclip
2个回答
10
投票

XClip 在没有

-verbose
的情况下启动时会分叉一个子组件。与
-verbose
的唯一区别是没有子进程,并且相同的原始进程处理 ConvertSelection 事件。

通常在 X Window 工具包中,复制/粘贴是通过 X Selections:

实现的

选择是由原子命名并由原子拥有的全局服务器资源 特定客户。选择的数量不受限制 协议;可能存在与原子一样多的选择。选择是 旨在为建立沟通机制提供基础 客户之间。官方定义可以在词汇表中找到 X 协议:

“...具有动态类型的间接属性;也就是说, 属性不是存储在服务器中,而是被维护 由某个客户(“所有者”)。 选择本质上是全球性的,并且是 被认为属于用户(尽管由客户端维护), 而不是作为特定窗口子层次结构或 特定的客户群。”

从应用角度来看, 选择提供了一种在 X 之间传输信息的机制 客户。由于 X 是一种网络协议,因此存在单独的 各个客户端之间的数据传输通道不能 假设存在。选择仅用于数据传输 直接涉及应用程序的用户界面方面, 尽管这项政策没有任何执行。

选择的内容存储在应用程序本身中并通过以下方式请求 ConvertSelection 事件(此处“转换”是因为客户端有一种方法 询问所选数据的特定 mimetype(或“视图”或格式)。 转换再次发生在拥有所选缓冲区的应用程序中。

由于这种架构,无法“复制文本到系统” 缓冲区并退出” - 因为你是系统缓冲区。XClip 模拟“复制并退出” 通过分叉和守护进程。


0
投票

正如已接受的答案所解释的那样,它没有解决问题; “复制”到剪贴板的数据实际上从未复制到剪贴板。相反,剪贴板记录了能够生成假装复制到剪贴板的信息的过程。通过这种方式,剪贴板被设计为处理可能以多种不同方式呈现的大量复杂信息。人们可能会认为简单文本会例外,但没有例外。

因此,将信息“复制”到剪贴板的程序需要继续运行,直到剪贴板的内容被另一个可执行文件替换。如果将信息“复制”到剪贴板的进程结束,则剪贴板的内容将丢失。

Xclip 立即读取数据,然后将自身去守护到后台,等待在请求时提供服务,xclip 在计算请求时调用“等待选择请求”。

xclip -selection clipboard <(echo -n 'test')

工作精美,同时

x=`echo -n hi-; xclip -selection clipboard <(printf '%s' 'test'); echo there`

将“hi-there”分配给 x,但永远不会返回,因为 bash 等待 xclip 向 stdout 写入内容,而这永远不会发生。

x=`echo -n hi-; 1>/dev/null xclip -selection clipboard <(echo -n 'test'); echo you`

此过程无需等待 xclip 结束即可返回,因为 bash 知道 xclip 的任何可能输出都不会为其生成输出,因为输出已在其他地方重新分配。问题解决了。

© www.soinside.com 2019 - 2024. All rights reserved.