跟踪时,xclip不会终止

时间:2013-10-08 17:13:20

标签: linux unix ubuntu x11 xclip

我做了以下观察:

$ 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。

1 个答案:

答案 0 :(得分:8)

XClip在没有-verbose的情况下启动时会分叉一个孩子。与-verbose的唯一区别在于没有子分叉且原始进程处理ConvertSelection个事件。

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

  

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

     

“......具有动态类型的间接属性;即,   而不是将属性存储在服务器中,它被维护   由一些客户(''所有者'')。   选择是全球性的,是   被认为属于用户(虽然由客户维护),   而不是私有的特定窗口子层次结构或   特别是一组客户。“

     

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

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

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