Несколько псевдотерминалов xterm, используемых в качестве выходных данных только из нескольких потоков

Я работал над запуском нескольких потоков из моей программы, из которых я хотел бы, чтобы каждый из них выводил их в соответствующие окна терминала (которые я выскочил в виде мозаики).

Они не являются оболочками, а только терминальными окнами для вывода.

Я пишу на Ubuntu в C. У меня это работает, но по какой-то причине, через несколько минут, как будто буферы отображения xterm заполняются (независимо друг от друга), и они перестают отображать новый текст. Старый текст остается, потоки продолжают делать свое дело в фоновом режиме, но просто не выводятся новые данные.

Я перепробовал все, что смог найти и остался в замешательстве.

Я не могу найти возможное:

  • буфер мне нужно промыть или очистить
  • способ очистки экрана (эти escape-коды VT ничего не делают даже после того, как я перенаправил ввод или попытался отправить их в качестве вывода в xterm)
  • способ переместить курсор в верхнем левом углу окна терминала
  • способ сбросить дескриптор файла, который я указал на соответствующий / dev / pts

Вот как это происходит сейчас (также, пожалуйста, не стесняйтесь указывать на что-то избыточное или неправильное в том, что я делаю; переносимость NB не очень важна в этой ситуации). Я пропустил проверку ошибок. Хотелось бы, чтобы мне не приходилось использовать system (), но это единственный способ заставить его работать (posix_spawn также не работал). Этот код запускается в каждом потоке (эффект листов не показан, но он управляется через общую память и некоторые дополнительные параметры в командной строке xterm):

char buf_xt[256]; // Used along with sprinf() and write() to output to xterm
char *pSptyName;
int xterm_fd1; // File descriptor for xterm

xterm_fd1 = posix_openpt(O_RDWR | O_NONBLOCK | O_NOCTTY);

pSptyName = ptsname(xterm_fd1);
sprintf(buf_xt, "xterm -S%s/%d &", pSptyName, xterm_fd1);
system(buf_xt);

Я вывод на Xterm, как это:

sprintf(buf_xt, “Writing to xterm.\n”);
write(xterm_fd1, buf_xt, strlen(buf_xt));

Я надеюсь, что, возможно, newterm () из curses может сработать (открыт для других идей), но я не могу найти где-нибудь полезную литературу или примеры, поэтому я надеюсь, что кто-то здесь может предоставить некоторую реальную информацию, кроме RTFM (у меня уже есть, но конкретная реализация поможет заполнить пробелы в документации).

Как примечание, когда я закрываю программу, у меня нет способа закрыть экземпляры xterm по отдельности. Я должен сделать еще один system() позвонить killall xterm, поэтому любые идеи по этому поводу также будет принята с благодарностью.

Спасибо

1 ответ

В источниках ncurses, ditto Программа (test/ditto.c) может быть скомпилирована для создания нескольких xterms, например, запустив ее как

ditto first second

создать два xterms с этими заголовками (в дополнение к экрану, с которого вы начинаете).

Что использует newterm, Для этого вам нужно настроить ncurses с помощью --with-pthread вариант. Это не решает проблему закрытия xterms.

Другие вопросы по тегам