分类: 嵌入式
2012-06-17 16:11:11
关于如何使用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一次,最后打印出子进程终止的信息。