I want to write a simple, dumb, X terminal emulator in C on a Linux system.
At first, I just thought I would have to popen a shell and display its output.
I checked xterm and rxvt code, and it looks a bit more complicated.
First, I have to open a pseudo-terminal with openpty. So I look at the man page and see that openpty fills 2 file descriptors, the master and the slave.
Both xterm and rxvt code are messy because of the system-dependent-ness of those specials files.
I understand the termios stuff : it's just a bunch of information about the escape code of the terminal.
What I really don't get is : what am I suppose to do with the master/slave file descriptor ?
An example program which open a terminal, logs in, executes a "ls" on the shell would be awesome.
(English is not my native language, excuse my eventual mistake)
Edit:
Here's the sample code I came up with :
#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 == '
')
putchar("
");
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, "
", 1);
} else {
write(master, "date
", sizeof "date
");
}
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] = '';
safe_print(buf);
}
}
close(master);
return 0;
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…