使用 Ttyutils 截获 UNIX/Linux 终端
2008-09-23 08:23:44 来源:WEB开发网第 15 到 19 行调用 t_rpc_call_set_target() 函数,它用我们上面设置好的 target 结构体作为参数。
t_println() 是一个调试用的函数,当编译程序时定义了 DEBUG 或者 T_DEBUG 时,它的功能和 printf() 类似,当没有定义上面的两个宏时,它不生成任何代码。
第 21 到 25 行调用函数 t_rpc_call_feed (),这个函数访问 ttyexec 提供的 feed 服务,它的作用是发送一些数据到 ttyexec 作为标准输入。
g_warning() 是 glib 提供的一个函数,它的作用是输出一条警告消息。
第 27 行调用 t_uninit() 函数,它的作用是释放资源,应该在程序退出之前调用。
Ttyutils 内部原理描述
前面描述了如何使用 ttyutils 软件包中的程序来监控终端的会话,读者可能好奇它的内部是如何工作的,这一部分将描述这些内容。
实现 ttyexec
ttyexec 是一个监控程序,它通过建立一个伪终端来运行一个应用程序,从而达到监控那个应用程序的目的。所以,要理解 ttyexec 的实现,必须理解伪终端。
伪终端
伪终端这个名词暗示它是一个虚拟的终端,应用程序可以将其作为一个终端设别使用,但是它不是一个真实的终端,一个伪终端由两端构成,分别称为伪终端主设备和从设备,任何写到伪终端主设备的输入都会作为从设备端的输入,反之亦然。事实上所有从设备端的输入都来自于主设备上的用户进程。这看起来就像一个流管道,但从设备上的终端行规程使我们拥有普通管道之外的其他处理能力。
文件 /dev/ptmx 是一个字符设备,它用来建立伪终端主从设备。
截获进程输入输出
ttyexec 通过建立一个伪终端,然后调用 fork。子进程建立了一个新的对话,打开一个相应的伪终端从设备,将它复制成标准输入、标准输出和标准出错,然后调用 exec。伪终端从设备成为子进程的控制终端。
更多精彩
赞助商链接