-----------------------------------------------------------
本文系本站原创
,
欢迎转载
!
转载请注明出处
:http://sjj0412.cublog.cn/
-----------------------------------------------------------
Linux
下伪终端是对应于
/dev/pts/x
,这个
/dev/pts
其实也只是
devpts
的挂载目录,通
过如下命令挂在的。
mount devpts /dev/pts -t devpts
伪终端
(Pseudo Terminal)
是成对的逻辑终设备
(
即
master
和
slave
设备
,
对
master
的操作会反映
到
slave
上
)
。
例如
/dev/ptyp3
和
/dev/ttyp3(
或者在设备文件系统中分别是
/dev/pty/m3
和
/dev/pty/s3)
。它
们与实际物理设备并不直接相关。如果一个程序把
ptyp3(master
设备
)
看作是一个串行端口设备,则它
对该端口的读
/
写操作会反映在该逻辑终端设备对应的另一个
ttyp3(slave
设备
)
上面。而
ttyp3
则是另
一个程序用于读写操作的逻辑设备。
这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用
ttyp3
的程序则认为自己正在
与一个串行端口进行通信。这很象是逻辑设备对之间的管道操作。对于
ttyp3(s3)
,任何设计成使用一个
串行端口设备的程序都可以使用该逻辑设备。但对于使用
ptyp3
的程序,则需要专门设计来使用
ptyp3(m3)
逻辑设备。
例如,如果某人在网上使用
telnet
程序连接到你的计算机上,则
telnet
程序就可能会开始连接到设备
ptyp2(m2)
上
(
一个伪终端端口上
)
。
此时一个
getty
程序就应该运行在对应的
ttyp2(s2)
端口上。
当
telnet
从远端获取了一个字符
时,该字符就会通过
m2
、
s2
传递给
getty
程序,而
getty
程序就会通过
s2
、
m2
和
telnet
程序往网络上返回
”login:”
字符串信息。这样,登录程序与
telnet
程序就通
过
“
伪终端
”
进
行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。
但是到了现在,
/dev/pty/m
不再存在,只是以
file
(
/dev/ptmx
的一次打开)存在,
/dev/pty/s
对
应到了
/dev/pts/x
里。
故要创建伪终端,就必须打开
/dev/ptmx
文件。
一个典型的例子如下:
int main(){
int
fdm fds
;
char
*
slavename
;
extern
char
*
ptsname
();
fdm
=
open
(
"/dev/ptmx"
,
O_RDWR
);
/* open master */
grantpt
(
fdm
);
/* change permission of slave */
unlockpt
(
fdm
);
/* unlock slave */
slavename
=
ptsname
(
fdm
);
/* get name of slave */
fds
=
open
(
slavename
,
O_RDWR
);
/* open slave */
ioctl
(
fds
,
I_PUSH
,
"ptem"
);
/* push ptem */
ioctl
(
fds
,
I_PUSH
,
"ldterm"
);
/* push ldterm */
glib
中的
ptsname
实现大致如下:
char
*
ptsname
(
int
fd
)
{
unsigned
int
pty_num
;