我想用C语言在Linux系统上编写一个简单,笨拙的X终端仿真器。* nix伪终端如何工作?主/从通道是什么?
起初,我只是认为我必须打开一个shell并显示其输出。 我检查了xterm和rxvt代码,它看起来有点复杂。
首先,我必须用openpty打开一个伪终端。所以我看看手册页,看到openpty会填充2个文件描述符,即主服务器和从服务器。 由于这些特殊文件的系统依赖性,xterm和rxvt代码都是混乱的。
我明白termios的东西:它只是一堆关于终端转义码的信息。 我真的没有得到的是:我想用主/从文件描述符做什么?
一个打开终端,登录并在shell上执行“ls”的示例程序非常棒。
(英语不是我的母语,原谅我最后的错误)
编辑: 这是我想出了示例代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <pty.h>
#include <utmp.h>
#include <ctype.h>
void
safe_print (char* s)
{
while(*s) {
if(*s == '\n')
putchar("\n");
else if(iscntrl(*s))
printf("\\e(%d)", *s);
else
putchar(*s);
s++;
}
}
int
main (int argc, char** argv)
{
char buf[BUFSIZ] = {0};
int master;
int ret = forkpty(&master, NULL, NULL, NULL);
if(ret == -1)
puts("no fork"), exit(0);
if(!ret) {
execl("/bin/sh", "sh", NULL);
exit(0);
}
sleep(1); /* let the shell run */
if(argc >= 2) {
write(master, argv[1], strlen(argv[1]));
write(master, "\n", 1);
} else {
write(master, "date\n", sizeof "date\n");
}
while(1) {
switch(ret = read(master, buf, BUFSIZ)) {
case -1:
puts("error!");
exit(1);
break;
case 0:
puts("nothing.."), sleep(1);
break;
default:
buf[ret] = '\0';
safe_print(buf);
}
}
close(master);
return 0;
}
我认为,名为“屏幕”的命令行程序使用这个。这样,您就可以在主机上拥有一个登录控制台,并且如果您被抛出,您可以重新登录并重新连接该会话,然后继续。这是pty的本质。它有一个与主机系统相互作用的通道,以及你在外部告诉它要做什么(并看到结果)的“后向通道”。我也没有任何实施经验,我在“Linux应用程序开发”中阅读了他们。在X下,我想还有更多的橱窗装饰,但其基本原则应该是 – gbarry 2009-01-24 17:49:47