2015-10-04 1 views
0

Я начал писать простой чат-приложение (Linux) с использованием сокетов. Я хотел запустить отдельный терминал (xterm) для чата. Поэтому я попытался разблокировать и запустить xterm из приложения чата. Но я не могу управлять новым окном xterm с помощью exec, используя мое приложение для чата. Я использовал dup2(slave, STDIN_FILENO), STDOUT_FILENO и STDERR_FILENO, но все же новое окно xterm не использует терминал «slave» для ввода-вывода.управление xterm с использованием псевдотерминала в C

(я пробовал http://www.linusakesson.net/programming/tty/, http://rachid.koucha.free.fr/tech_corner/pty_pdip.html и код от «Расширенного программирования в среде Unix)

Я также попытался Xterm -S. Она работает, но я не удовлетворен его использование.

+0

Почему вы хотите запустить xterm? Он устарел и не установлен по умолчанию везде. –

+0

Без какой-либо примерной программы (из OP, чтобы проиллюстрировать проблему), или от комментаторов, чтобы указать на конструктивные решения, здесь не так много обсуждать. –

+0

ОК. В ссылке http://rachid.koucha.free.fr/tech_corner/pty_pdip.html, pls ссылаются на mypty3.c. Упоминается, что могут использоваться telnet, xterm, rlogin и т. Д. Но я не могу использовать xterm. И я не хочу специально запускать «xterm», любой эмулятор терминала будет делать для моих нужд. Я просто хочу, чтобы отдельный был «чат-окном». –

ответ

0

Здесь как я делаю что-то подобное (в C под Linux):

// Open a pseudo-terminal master 
int ptmx = open("/dev/ptmx", O_RDWR | O_NOCTTY); 
if (ptmx == -1) { 
    printf("Failed to open pseudo-terminal master-slave for use with xterm. Aborting..."); 
    quit(); // closes any open streams and exits the program 
} else if (unlockpt(ptmx) != 0) { 
    printf("Failed to unlock pseudo-terminal master-slave for use with xterm (errno. %d). Aborting...", errno); 
    close(ptmx); 
    quit(); 
} 
else if (grantpt(ptmx) != 0) { 
    printf("Failed to grant access rights to pseudo-terminal master-slave for use with xterm (errno. %d). Aborting...", errno); 
    close(ptmx); 
    quit(); 
} 

// open the corresponding pseudo-terminal slave (that's us) 
char *pts_name = ptsname(ptmx); 
printf("Slave-master terminal: %s", pts_name); 
int pts = open(pts_name, O_RDWR | O_NOCTTY); 

// launch an xterm that uses the pseudo-terminal master we have opened 
char *xterm_cmd; 
asprintf(&xterm_cmd, "xterm -S%s/%d", pts_name, ptmx); 
FILE *xterm_stdout = popen(xterm_cmd, "r"); 
if (xterm_stdout <= 0) { 
    printf("Failed to open xterm process. Aborting..."); 
    ptmx = 0; 
    close(ptmx); 
    quit(); 
} 

// Set the stdin/stdout to be the pseudo-terminal slave 
dup2(pts, STDIN_FILENO); 
dup2(pts, STDOUT_FILENO); 

printf("This appears in the terminal window.\n"); 

Теперь ничего получать вводится в терминале подаваемые, и что-нибудь программы stdin, что программа выводит на stdout появляется в терминале. Вы можете использовать библиотеку readline, linenoise или даже curses по желанию.

0

Вы можете передать команду непосредственно на xterm, используя опцию -e. Вы можете создать сам чат (читать fron stdin и писать в stdout и т. Д.) В отдельном двоичном файле, а xterm нужно будет только выполнить этот двоичный файл.

Смежные вопросы