tty
终端(termimal)= tty(Teletypewriter, 电传打印机),作用是提供一个命令的输入输出环境,在linux下使用组合键ctrl+alt+T打开的就是终端,可以认为terminal和tty是同义词。
tty泛指所有的终端设置,这些是真实存在的设备。
通过tty命令可以查看当前终端连接的设备。
通过telnet登录到设备上,执行tty命令如下:
通过串口登录到设备上,执行tty命令如下:
pty
伪终端,没有实际设备的其他虚拟终端,没有真实的终端连线,如ttyUSB或consone接线。例如通过telnet或ssh登录的终端。
ptmx和pty
telnet使用make_new_session来创建一个新的session.
在make_new_session中调用xgetpty来创建一个伪终端会话。
int FAST_FUNC xgetpty(char *line)
{
int p;
#if ENABLE_FEATURE_DEVPTS
p = open("/dev/ptmx", O_RDWR);
if (p > 0) {
grantpt(p); /* chmod+chown corresponding slave pty */
unlockpt(p); /* (what does this do?) */
#if 0 /* if ptsname_r is not available... */
const char *name;
name = ptsname(p); /* find out the name of slave pty */
if (!name) {
bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
}
safe_strncpy(line, name, GETPTY_BUFSIZE);
#else
/* find out the name of slave pty */
if (ptsname_r(p, line, GETPTY_BUFSIZE-1) != 0) {
bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
}
line[GETPTY_BUFSIZE-1] = '\0';
#endif
return p;
}
#else
struct stat stb;
int i;
int j;
strcpy(line, "/dev/ptyXX");
for (i = 0; i < 16; i++) {
line[8] = "pqrstuvwxyzabcde"[i];
line[9] = '0';
if (stat(line, &stb) < 0) {
continue;
}
for (j = 0; j < 16; j++) {
line[9] = j < 10 ? j + '0' : j - 10 + 'a';
if (DEBUG)
fprintf(stderr, "