分析一下logwrapper的原理


关于如何使用logwrapper,请参考下面这篇文章:使用logwrapper调试Android程序(http://hi.baidu.com/snownight/blog/item/91d55edfa2dc1f0149540399.html)

 

我这里描述一下logwrapper的原理,看logwrapper是如何利用伪终端机制来监视一个进程的STDOUT和STDERR。

 

伪终端是由主终端和从终端这两个构成的。

 

一、logwrapper打开主终端

parent_ptty = open("/dev/ptmx", O_RDWR);

 

二、获取从终端的名字

child_devname = (char*)ptsname(parent_ptty)

 

三、fork子进程,然后在子进程中打开从终端:

child_ptty = open(child_devname, O_RDWR);

 

接下来,把子进程的STDOUT和STDERR重定向到从终端

dup2(child_ptty, 1);

dup2(child_ptty, 2);

 

最后,调用child函数运行程序

child(argc - 1, &argv[1]);

 

四、父进程最后调用parent()函数并进入循环读取主终端中的数据(即,子进程的程序向从终端输出的数据)并存放在char buffer[4096]中。当子进程的输出数据填满buffer时,父进程会向/dev/log/*下面的设备flush一次。子进程执行完毕后再flush一次,最后打印出子进程终止的信息。

你可能感兴趣的:(android,buffer,终端)