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

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

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

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

Я пробовал все, что мог найти, и остаюсь сбитым с толку.

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

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

Вот как это выглядит сейчас (также, пожалуйста, не стесняйтесь указывать на что-либо избыточное или неправильное в том, что я делаю; N.B. переносимость не очень важна в этой ситуации). Я пропустил проверку ошибок. Я бы хотел, чтобы мне не приходилось использовать 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, поэтому любые идеи по этому поводу также будут очень признательны.

Спасибо


person J-a-n-u-s    schedule 01.02.2016    source источник
comment
Это трудно отладить... Одно предположение: возможно ли, что вы выводите управляющую последовательность, такую ​​как XOFF (ctrl+s), управляющую последовательность или что-то подобное? Можете ли вы попытаться отфильтровать вывод только для печатных символов?   -  person Ctx    schedule 02.02.2016
comment
Спасибо за ответ. Я вывожу очень простой текст, например "|---Connecting\n" "|-Talking...\n" Это результат, который я закодировал, а не какой-то неизвестный материал... Есть еще идеи? Я изучил эту [ссылку] (linusakesson.net/programming/tty), и это прыгнуло на меня, но я не могу понять, как очистить тот буфер ядра, о котором они говорят. Псевдотерминал может хранить только определенный объем данных внутри своего буфера ядра, и когда этот буфер заполнен [...]   -  person J-a-n-u-s    schedule 02.02.2016
comment
Можете ли вы запустить strace на зависшем процессе xterm, чтобы увидеть, что он пытается сделать?   -  person Ctx    schedule 02.02.2016
comment
хм, вы знаете, как это сделать, поскольку я запускаю его из вызова system() и просто передаю местоположение pts в качестве аргумента командной строки?   -  person J-a-n-u-s    schedule 02.02.2016
comment
Получите pid с помощью ps afx или аналогичного и выполните strace -p <pid>   -  person Ctx    schedule 02.02.2016


Ответы (1)


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

ditto first second

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

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

person Thomas Dickey    schedule 02.02.2016