Навигация

Исторически сложилось, что есть два различных API для работы с псевдотерминалами: BSD и System V (aka UNIX 98). BSD-вариант (openpty(3), forkpty(3)) псевдотерминалов признан устаревшим и не рекомендуется к использованию (man 7 pty).

Для создания UNIX 98-псевдотерминала нужно воспользоваться следующей последовательностью системных вызовов:

После этого можно будет узнать имя для 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

В появившемся окне можно что-нибудь писать. Если писать большие латинские буквы, то будут появляться не они.