2011-12-04 64 views
10

Próbuję dowiedzieć się, jak używać pseudo-terminali w Linuksie, zasadniczo chcę utworzyć klon telnetd, o czym wspomniałem in an earlier question.Jak korzystać z pseudo-terminali w systemie Linux z C?

rozumiem pojęcia nadrzędnego i podrzędnego terminalu, i mam podstawowe zrozumienie, w jaki sposób korzystać z wywołań systemowych w C.

Moje pytanie dotyczy następny krok po otwarciu pliku deskryptora Slave/Master. Jak wypuścić getta do niewolnika? Czy są jakieś zasoby dobre w sieci za pomocą funkcji forkpty(), openpty() lub innego interfejsu API?

Niektóre przykłady w C mogą pomóc. This was a very similar question, ale nikt tak naprawdę nie podał żadnych przykładów.

Odpowiedz

9

Advanced Programming in the Unix Environment, 2nd Edition ma wspaniały rozdział na temat warstwy pseudoterminalnej dostępnej w Linuksie. Najlepszą częścią jest source code, który zawiera sterownik pty i bardzo wyraźnie pokazuje, jak korzystać z interfejsów pty. (Program pty buduje jest przydatna w sobie, jeśli chcesz prowadzić program terminala tylko programowo, ale nie chcą używać expect(1).)

+0

Link Kod źródłowy jest 404 nie znaleziono strony –

+0

@ JérémyPouyet, dzięki za ogłoszenia; Poprawiłem link, aby wskazać kod drugiej edycji (który jest znanym mi kodem) - być może trzecia edycja byłaby lepszym wyborem, ale nie przeczytałem jeszcze tego kodu. Pewnego dnia. :) – sarnold

+0

Czy możesz znaleźć licencję tego kodu? –

0

Nie lauch getty dla Ptyś. Getty to tylko część procesu "słuchacza". W przypadku terminali przewodowych każde urządzenie końcowe stale "nasłuchuje". Dla telnet demon wykonuje część nasłuchującą (na gnieździe) i obsługuje żądanie połączenia przez , tworząc parę pty i fork() ing/exec() ing. I rzeczywiście: APUE obsługuje bardzo dobrze ptys.

3

obejmują

#include <sys/stat.h> 

#include <fcntl.h> 

#define _XOPEN_SOURCE 

#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
char *slavename; 
int masterfd; 
masterfd = open("/dev/ptmx", O_RDWR); 
grantpt(masterfd); 
unlockpt(masterfd); 
slavename = ptsname(masterfd); 
... 
} 

napisałem prosty przykład wykazując terminala pseudo Master Slave koncepcji. Proszę przejść przez ten link, aby uzyskać zrozumienie terminali w Linux http://www.linusakesson.net/programming/tty/

+0

Jest to prosta prosta odpowiedź. Jest to udokumentowane tutaj: http://linux.die.net/man/4/ptmx – EdH