8

我做了以下观察:

$ 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 中退出时,实际上什么都不是。

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

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

xclip在 Ubuntu 13.04 上运行 0.12 版。

4

1 回答 1

8

XClip 在没有-verbose. 唯一的区别-verbose是没有子分叉,并且相同的原始进程处理ConvertSelection事件。

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

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

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

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

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

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

于 2013-10-08T23:27:05.247 回答