#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 нередки случаи, когда ошибки исправляются сообществом. Если вы согласны, я все еще могу отредактировать ваш фрагмент, и в этом случае мне больше не придется понижать его, потому что он не работает 🙂 Просто дайте мне знать, приветствия (тем временем я опубликовал рабочий фрагмент в качестве отдельного ответа)