-
如何操作伪终端:
-
伪终端的使用是成对出现的,分为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会带出从设备的文件描述符,第三个实参如果不空的话,它会带出从设备的路径名!后边两个参数是在设置终端属性,一般是不要的,据说伪终端对属性设置是忽略的*/
-
-
if
(rtnVal != -1)
-
{
-
pName = ptsname(mpty);
-
printf(
"Name of slave side is <%s> fd = %d/n"
, pName, spty);
-
-
strcpy(sptyname, pName);
-
printf(
"my sptyname is %s/n"
,sptyname);
-
-
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);
-
-
-
-
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;
-
} http:
-
-
伪终端的操作:
-
以下是源码,来自/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:
[cpp] view plain copy如何操作伪终端: 伪终端的使用是成对出现的,分为master 和 slaver 主设备:/dev/ptmx (i850上的主设备名) 从设备:动态生成:/dev/pts/0.......x 功能:写入主设备的信息,可以从从设备上读出;写入从设备的信息,可以从主设备读出。用以实现对串口的多路复用。
各种平台打开
伪
终端
设备的方法有所不同。在Single UNIX Specification的XSI扩展
中
包含了很多函数,试图统一这些方法。这些函数的基础是SVR4用于管理基于STREAMS的
伪
终端
的一组函数。
posix_openpt用来打开下一个可用的
伪
终端
主设备,该函数是可移植的。
#include <stdlib.h>
#include <fcntl.h>...
在
终端
和运行的程序之间有一个
终端
行规程(见http://www.cnblogs.com/nufangrensheng/p/3575752.html
中
的图18-2),通过它我们能够在
终端
上设置特殊字符(退格、行删除、
中
断等)。但是,当一个登陆请求到达网络连接时,
终端
行规程并不是自动被加载到网络连接和登陆程序shell之间的。
伪
终端
这个术语暗示对于一个应用程序而言,它看上去像一个终...
1.通常一个进程打开
伪
终端
主设备,然后调用fork。子进程建立了一个新的会话,打开一个相应的
伪
终端
从设备,将其文件
描述符复制到标准输入、标准输出和标准出错,然后调用exec。
伪
终端
从设备成为子进程的控制
终端
。
2.对于
伪
终端
从设备之上的用户进程
伪
终端
就是指,一个应用程序看上去像一个
终端
,但事实上它并不是个真正的
终端
。下图显示了使用
伪
终端
时相关进程的典型安排。
[img]http://dl2.iteye.com/upload/attachment/0129/9523/81165c3d-0144-3e08-bb9d-dc8a16b4ccc9.png[/img]
图
中
的关键点如下。
1、通常,一个进程打开
伪
终端
主...
p align="JUSTIFY">19.3 打开
伪
终端
设备
在SVR4和4.3+BSD系统
中
打开
伪
终端
设备的方法有所不同。我们提供两个函数来处理所有细节:
pty
m_open用来打开下一个有效的
伪
终端
主设备,
pty
s_open用来打开相应的从设备。
#include ourhdr.h
int
pty
m_open(char *pts_name);
返回:如果操作成功
通常,一个进程打开
伪
终端
主设备,然后调用fork,子进程建立一个新的会话,打开一个相应的
伪
终端
从设备,将其文件描述符复制到stdin、stdout、stderr。然后调用exec执行新程序。
伪
终端
从设备成为了子进程的控制
终端
。
对于
伪
终端
从设备上的用户进程来说,其stdin、stdout、stderr都是
终端
设备。通过这些描述符,用户进程能够处理第18章
中
的所有
终端
I/O
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的
编程
任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络
编程
等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的
编程
语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示
中
更有效地传达信息。
1. 打开
终端
应用程序。
2. 输入命令“bash”或“sh”,然后按Enter键。这将使您进入Bash或Shell
编程
界面。
3. 您可以开始编写shell脚本或在该界面
中
执行各种命令。
如果您想退出shell
编程
界面,可以输入命令“exit”或“logout”,然后按Enter键即可。