Квазиполезное
Исторически сложилось, что есть два различных API для работы с псевдотерминалами: BSD и System V (aka UNIX 98). BSD-вариант (openpty(3)
, forkpty(3)
) псевдотерминалов признан устаревшим и не рекомендуется к использованию (man 7 pty
).
Для создания UNIX 98-псевдотерминала нужно воспользоваться следующей последовательностью системных вызовов:
posix_openpt(3)
;grantpt(3)
;unlockpt(3)
.После этого можно будет узнать имя для slave-устройства с помощью `ptsname(3).
Пример кода:
#define _XOPEN_SOURCE 600
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#define check(x) if ((x) == -1) { \
perror(#x); \
exit(1); \
}
int main()
{
int ptymfd = posix_openpt(O_RDWR);
check(ptymfd);
check(grantpt(ptymfd));
check(unlockpt(ptymfd));
char *slavename = ptsname(ptymfd);
printf("pty = %s\n", slavename);
while (1)
{
char ch;
int r = read(ptymfd, &ch, 1);
check(r);
if ('A' <= ch && ch < 'Z')
ch++;
int w = write(ptymfd, &ch, 1);
check(w);
}
return EXIT_SUCCESS;
}
Эта несложная программа создаёт псевдотерминал, который увеличивает значение почти каждой введённой заглавной буквы на 1. Скомпилировав и запустив эту программу, можно получить имя slave-устройства (например, /dev/pty/7
). Передадим затем это имя программе minicom
(запущенной, для убедительности, в каком-нибудь другом терминале).
$ minicom -p /dev/pty/7
В появившемся окне можно что-нибудь писать. Если писать большие латинские буквы, то будут появляться не они.