Я работал над запуском нескольких потоков из моей программы, из которых я хотел бы, чтобы каждый из них выводил в свои соответствующие окна терминала (которые у меня появляются в мозаичном шаблоне).
Это не оболочки, а просто терминальные окна для вывода.
Я кодирую на 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
, поэтому любые идеи по этому поводу также будут очень признательны.
Спасибо
"|---Connecting\n" "|-Talking...\n"
Это результат, который я закодировал, а не какой-то неизвестный материал... Есть еще идеи? Я изучил эту [ссылку] (linusakesson.net/programming/tty), и это прыгнуло на меня, но я не могу понять, как очистить тот буфер ядра, о котором они говорят. Псевдотерминал может хранить только определенный объем данных внутри своего буфера ядра, и когда этот буфер заполнен [...] - person J-a-n-u-s   schedule 02.02.2016ps afx
или аналогичного и выполнитеstrace -p <pid>
- person Ctx   schedule 02.02.2016