Почему терминал запуска приложения Eclipse на C печатает мусор при вызове `system (" clear ")` (определено в stdlib.h)? - PullRequest
0 голосов
/ 12 декабря 2018

Я использую Eclipse Oxygen.3A для разработки на C, и операционная система, на которой я работаю, - это Fedora 28. Проект C, который я пытаюсь отладить, содержит несколько экземпляров system("clear");.Когда я компилирую и запускаю приложение с локального терминала Fedora, любые вызовы system() будут вести себя нормально.После использования инструментов отладки Eclipse, чтобы «перешагнуть» оператор и выполнить его, терминал запуска напечатал мусор (см. Скриншот ниже).Один и тот же вывод печатается при каждом запуске программы.

imagesystem("clear") is executed">

Я создал новый проект с такими же переменными среды, который изолировал это утверждение, но получил тот же результат (см. Скриншот ниже).Единственная переменная окружения, присутствующая в любой конфигурации запуска, - это TERM, которая установлена ​​в xterm-256color (значение, напечатанное локальным терминалом Fedora при вводе echo $TERM).Я не смог найти никаких результатов в Интернете, касающихся этой конкретной проблемы, и не понимаю, как эта функция реализована во время компиляции.

Separate

Содержимое исходного файла в тестовом проекте:#include

int main(void) {
    system("clear");
    return 0;
}

Генерируемый вывод: '[ESC]' + "[3J" + '[ESC]' + "[H" + '[ESC]' + "2J"

Примечание. Представьте, что эта строка объединена.Я не смог записать вывод буквально, потому что StackOverflow не может представлять символ «escape».

Мои знания Linux, bash и инструментов, предоставляемых GNU, довольно ограничены, поэтому дайте мне знать, если есть какая-либо дополнительная информацияна этот случай было бы полезно вместе с тем, как его получить.Кроме того, любые отзывы о том, как я могу улучшить этот пост, приветствуются.

1 Ответ

0 голосов
/ 12 декабря 2018

Ну, здесь все работает как положено.

Динозавры могут помнить время, когда мы использовали последовательные терминалы.В те давние времена мы все знали, что форматирование экрана выполняется с помощью специальных последовательностей управления.Терминалы Unix-Linux (консоль, xterm и друзья) по-прежнему используют этот старый добрый интерфейс terminfo, где возможности экрана и специальные последовательности объявляются в базе данных terminfo с ключом, заданным переменной среды TERM.

Согласно вашему изображению затмения, clear только что отправил последовательность Esc [ 3 J Esc [ H Esc [ 2 J.Терминал очищается при получении, но окно вывода Eclipse просто отображает его, чтобы помочь разработчику узнать, какие управляющие символы были отправлены.Вы можете даже увидеть 1B ascii-код управляющего символа Esc в маленьких квадратах, когда посмотрите на изображение в полном разрешении ...

Это означает, что здесь нечего делать: вы попросили программуотправьте escape-последовательность clear , и окно вывода Eclipse подтвердит, что она действительно была отправлена.

...