Как отобразить терминал в приложении Linux?

#c #linux #terminal #show #ncurses

#c #linux #терминал #показать #ncurses

Вопрос:

Мне было интересно, можете ли вы сделать так, чтобы, когда вы заходите и нажимаете на программу в Linux, она всегда автоматически вызывала командную строку для отображаемой информации, или если я решил использовать ncurses для интерфейса. Если да, то это системный вызов или вы можете сделать это с помощью ncurses? Потому что половина моей программы будет выполняться через терминал.

Спасибо

Комментарии:

1. Короче говоря, вам нужен интерфейс командной строки?

2. Да. Отображается автоматически при открытии программы. Как обычный терминал.

3. Большинство пользователей Linux просто ожидают запуска терминальной программы с самого терминала. Нажатие на приложение и запуск терминала немного необычны. Учтите, что существует большое количество терминальных программ, и у каждого пользователя будут свои предпочтения.

Ответ №1:

Поскольку нитт не позволил мне внести изменения в его фрагмент кода, я публикую исправленный фрагмент на случай, если кто-нибудь захочет его использовать:

 #include <cstdio>
#include <unistd.h>
#include <iostream>

int main(int argc, char* argv[])
{
    if (isatty(0))
    {
        std::cout << "Hello, World!" << std::endl;

        for (int i=0; i<argc; i  )
            std::cout << "arg: " << i << "t" << argv[i] << std::endl;

        std::cout << "Press return to continue . . ." << std::flush;
        std::cin.get();
    }
    else
    {
        const char* args[argc 3], **it=args;
        *it   = "gnome-terminal";
        *it   = "-x";
        it = std::copy(argv, argv argc, it);
        *it   = 0;

        if (-1 == execvp("gnome-terminal", (char* const*) amp;args[0]))
            perror("exec");
    }
}
  

Комментарии:

1. Вы бы добились большего успеха, используя isatty(0) в качестве основного теста.

2. @DonalFellows: спасибо за предложение. Я обновил код — теперь пересылка всех аргументов командной строки также прозрачна — ура!

3. 1: Сейчас это выглядит довольно неплохо. Незначительный нюанс: вам не нужно проверять наличие -1 в execvp (), поскольку это никогда не возвращается при успешном выполнении.

4. @DonalFellows: спасибо за ваш постоянный интерес. Мне это нравится. Возможно, это незначительная мелочь, но я здесь оттачиваю свою пилу, и все эти лакомые кусочки просто оттачивают мои навыки системного программирования Linux 🙂 приветствия

5. Теперь вы пошли другим путем. 🙂 функция execvp () может завершиться сбоем (например, если она не может найти программу), и в этом случае она вернется. Он просто никогда не возвращается успешно .

Ответ №2:

Да, просто вызовите терминал с вашим приложением в нем. Например:

 rxvt -e myapp
  

Запускает терминал, на котором запущено ваше приложение. Вы также могли бы использовать xterm. Если вы хотите использовать широкие символы / unicode, я рекомендую rxvt-unicode.

Вы можете поместить это в файл .desktop с определенным там значком, и тогда он будет размещен в системном меню.

Ответ №3:

 #include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int fileExists(string x321) {
ifstream x123 (x321.c_str());
string x213;
    x123 >> x213;
    if (x213 == "") {
        return false;
    } else {
        return true;
    }   

}

int createConsole(string fname) {
    if (fileExists("~tmp") == false) {
        ofstream tmp ("~tmp");
        tmp << "tmpfile";
        fname = "gnome-terminal -e "   fname;
        system(fname.c_str());
            system("exit");
        return 0;
    }
    remove("~tmp");
    return 1;
}

int main(int argc, char** args) {
            createConsole(args[0]);
        cout << "Hello, World!" << endl;
        cout << "Press return to continue . . .";
        cin.get();

}
  

Обратите внимание на функции «createConsole» и «FileExists». Я написал это сам.

Комментарии:

1. Привет, nitt, добро пожаловать в Stack overflow! Надеюсь, я не отпугнул вас своими правками. На SO нередки случаи, когда ошибки исправляются сообществом. Если вы согласны, я все еще могу отредактировать ваш фрагмент, и в этом случае мне больше не придется понижать его, потому что он не работает 🙂 Просто дайте мне знать, приветствия (тем временем я опубликовал рабочий фрагмент в качестве отдельного ответа)