我做了以下观察:
$ 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 Not closing stdout when setting clipboard from stdin相关吗?
我在Ubuntu 13.04上运行xclip
版本0.12。
答案 0 :(得分:8)
XClip在没有-verbose
的情况下启动时会分叉一个孩子。与-verbose
的唯一区别在于没有子分叉且原始进程处理ConvertSelection个事件。
通常在X Window工具包中,通过X Selections实现复制/粘贴:
选择是由atom命名并由a拥有的全局服务器资源 特别的客户。选择的数量不受限制 协议;可能存在与原子一样多的选择。选择是 旨在为建立沟通机制提供基础 客户之间。官方定义可以在the glosary中找到 X协议:
“......具有动态类型的间接属性;即, 而不是将属性存储在服务器中,它被维护 由一些客户(''所有者'')。 选择是全球性的,是 被认为属于用户(虽然由客户维护), 而不是私有的特定窗口子层次结构或 特别是一组客户。“
从应用程序的角度来看, 选择提供了在X之间传输信息的机制 客户端。由于X是一种联网协议,因此存在单独的 各个客户端之间的数据传输通道不能 假设存在。选择仅用于数据传输 直接关联应用程序的用户界面方面, 虽然没有执行这项政策。
选择内容存储在应用程序本身中并请求 ConvertSelection事件(这里“转换”因为客户端有一种方法 要求所选数据的特定mimetype(或“视图”或格式)。 转换再次发生在拥有所选缓冲区的应用程序中。
由于这种架构,没有办法“将文本复制到系统 缓冲并退出“ - 因为你是一个系统缓冲区.XClip模拟”复制并退出“ 通过分叉和守护。