如何操作伪终端: 
	伪终端的使用是成对出现的,分为master 和 slaver 
	主设备:/dev/ptmx (i850上的主设备名) 
	从设备:动态生成:/dev/pts/0.......x 
	功能:写入主设备的信息,可以从从设备上读出;写入从设备的信息,可以从主设备读出。用以实现对串口的多路复用。
	
	以下是测试代码 
	Ubuntu 下的编译方法: 
	gcc -Wall ptyhost.c -o ptyhost -util /lib/libutil-2.9.so 
	# include <stdio.h> 
	# include <stdlib.h> 
	# include <string.h> 
	# include <unistd.h> 
	# include <sys/types.h> 
	# include <linux/limits.h> 
	# include <pty.h> /* for openpty and forkpty */ 
	#include <utmp.h> /* for login_tty */ 
	#include <time.h> 
	# include <pty.h> /* for openpty and forkpty */ 
	#include <utmp.h> /* for login_tty */ 
	int main(int argc, char *argv[]) 
	{ 
	int rtnVal=0; 
	int mpty, spty, c=0, dev=0; 
	char *pName=NULL; 
	char ptyBuff[100] = {'/0'}; 
	char sptyname[20] = {'/0'}; 
	rtnVal = openpty(&mpty, &spty, sptyname, NULL, NULL);/*该函数遍历系统中的伪终端匹配对,如果能找到一组未使用的,则返回1,否则返回-1,成功返回时mpty会带出匹配对中主设备的文件描述符,spty会带出从设备的文件描述符,第三个实参如果不空的话,它会带出从设备的路径名!后边两个参数是在设置终端属性,一般是不要的,据说伪终端对属性设置是忽略的*/ 
	// Check if Pseudo-Term pair was created 
	if(rtnVal != -1) 
	{ 
	pName = ptsname(mpty);//get slave device name, the arg is the master device 
	printf("Name of slave side is <%s>    fd = %d/n", pName, spty); 
	 
	strcpy(sptyname, pName); 
	printf("my sptyname is %s/n",sptyname); 
	//test write to mpty and read from spty************* 
	char temp[50] = {"hell/nworld ! i have write to mpty!"}; 
	char temp2[100] = {'/0'}; 
	c = write(mpty,temp,5); 
	if(c <=0) 
	printf("ERROR : can not write to mpty/n"); 
	sleep(3); 
	printf("write %d charactors to mpty success/n",c); 
	sleep(3); 
	printf("try to read from spty/n"); 
	sleep(3); 
	c = read(spty,temp2,5); 
	if(c <=0) 
	printf("ERROR : can not read from mpty/n"); 
	printf("read from spty  %d charactors success/n",c); 
	printf("/n>>>>>  %s  <<<<</n/n___________________/n",temp2); 
	//************************************************** 
	 
	// Go into loop and read what is sent to Slave side of pair 
	while(1) 
	{ 
	c = read(mpty, ptyBuff, 100); 
	if(c > 0) 
	{ 
	printf("###-<%d>/n", c); 
	printf("buff:__|%s",ptyBuff); 
	} 
	} 
	} 
	else 
	{ 
	printf("PseudoTerm, creation failed.../n"); 
	} 
	return rtnVal; 
	}
	
	伪终端的操作: 
	以下是源码,来自/fsl_myandroid_r6/external/qemu/vl.c   line 2545 
	r7里面都已经没有了!真快呀!哈哈 
	/* Once Solaris has openpty(), this is going to be removed. */ 
	int openpty(int *amaster, int *aslave, char *name, 
	struct termios *termp, struct winsize *winp) 
	{ 
	const char *slave; 
	int mfd = -1, sfd = -1; 
	*amaster = *aslave = -1; 
	mfd = open("/dev/ptmx", O_RDWR | O_NOCTTY); 
	if (mfd < 0) 
	goto err; 
	if (grantpt(mfd) == -1 || unlockpt(mfd) == -1) 
	goto err; 
	if ((slave = ptsname(mfd)) == NULL) 
	goto err; 
	if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1) 
	goto err; 
	if (ioctl(sfd, I_PUSH, "ptem") == -1 || 
	(termp != NULL && tcgetattr(sfd, termp) < 0)) 
	goto err; 
	if (amaster) 
	*amaster = mfd; 
	if (aslave) 
	*aslave = sfd; 
	if (winp) 
	ioctl(sfd, TIOCSWINSZ, winp); 
	return 0; 
	err: 
	if (sfd != -1) 
	close(sfd); 
	close(mfd); 
	return -1; 
	}
	
	伪终端:http://www.linuxdiyf.com/linux/14435.html
用伪终端打开图形界面文件夹的方法:http://www.linuxdiyf.com/linux/9925.html

