2013-05-14 2 views
3

Я программирую на C++ с использованием Qt-4 в качестве фреймворка, учитывая каталог (например,/usr/bin), я хотел бы знать, является ли программа графическим интерфейсом или консолью заявление.Определите, является ли программа графическим или консольным приложением в Linux

Я столкнулся с некоторой информацией о том, как это сделать, а также о существовании аналогичной (для Win) идентификации в Linux (внутри эльфа). Есть ли альтернативный способ выполнения этого в Linux?

Я думал на:

  • нерест каждую запись QProcess и контролировать его срок службы при условии, консольное приложение потребует некоторых входных и, как я не предусматривает какой-либо, он будет печатать stoud сообщение справки и выход. Если он жив после x секунд, я бы убил процесс и пометил его как содержащий gui. Это ужасный подход и склонность к ошибкам;
  • Запустите ldd и проанализируйте вывод для любого libX или еще. Это лучший подход, хотя firefox, например, не может быть помечен как имеющий gui.

EDIT0: Этот проект является запуск приложений

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

ЗАКЛЮЧИТЕЛЬНОЕ ЗАКЛЮЧЕНИЕ:

После того, как люди ответили и добавили дополнительный поиск, на самом деле невозможно достоверно различать консольные и графические приложения. Лучше всего сделать несколько соображений, таких как поиск файлов .desktop, сделать несколько предположений, таких как инструменты, перечисленные в утилитах, - только такие места, как/bin,/sbin и/usr/sbin и т. Д.

Возможно, проанализируйте вывод ldd для каждой найденной записи.

Спасибо.

+4

В Linux нет надежного способа сделать это: программа может использовать либо консоль, либо графический интерфейс по своему усмотрению (например, консольные операции консоли для конкретных аргументов командной строки, но в противном случае GUI) или даже * оба в то же время * (например, ведение журнала консоли, когда пользователь манипулирует графическим интерфейсом). Как классифицировать эти программы? ;) В любом случае, ваш вопрос выглядит как проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – syam

+0

К сожалению, я не собирался проверять мои подходы. Должен ли я удалить этот список? – Eduardo

+1

Нет, ваш вопрос в порядке, как есть (иначе он был бы отключен). Просто я чувствую * (но я могу ошибаться), обнаруживая, использует ли программа графический интерфейс или нет, это не ваша настоящая проблема. – syam

ответ

1

Программа может попытаться запустить программу GUI, а затем переключиться на консоль. (И на самом деле некоторые программы демонстрируют такое поведение, например emacs). Можно даже сделать это случайно, или из-за какой-то конкретной конфигурации ...

Например, если предположить, что vi это консольная программа и emacs графическое один, следующая простая программа может случайным образом быть GUI или консоль:

#include <unistd.h> 

int main(int argc, char**argv) { 
    if (getpid()%2 == 0) 
     { argv[0]="vi"; execv("/usr/bin/vi", argv); } 
    else 
     { argv[0]="emacs"; execv("/usr/bin/emacs", argv); } 
    return EXIT_FAILURE; 
} 

Простейший (но не безупречный) способ сделать это, если getenv("DISPLAY") возвращает NULL. Более сложным способом было бы позвонить XOpenDisplay, который возвращает NULL при сбое (и несколько инструментов X11 делают это).

Итак, ваш вопрос не имеет точного ответа и на самом деле не имеет смысла.

Вы можете использовать ldd .... и добавлять исключения вручную, такие как firefox.

+0

Возможно, я не писал достаточно ясно, ваши предложения относительно getenv и XOpenDisplay не применимы к моему делу. Я не пытаюсь выяснить, могу ли я открыть gui. Моя программа - это пусковая установка, поэтому я хочу, чтобы пользователь мог помочь пользователю запустить терминал, когда он выбирает не графическое приложение. Это не критическое функциональное назначение, просто показалось, что это хорошая и сложная функция. – Eduardo

+1

Но я пытаюсь объяснить, что то, чего вы хотите достичь, в принципе невозможно. Будучи программой GUI, даже не определена. –

+0

Спасибо, Базиль, после ответов здесь и из результатов моего поиска, я убежден, что невозможно достоверно различить их. – Eduardo

1

Если вы пишете (еще одну) программу запуска приложений, пожалуйста, следуйте инструкциям, которые создали все другие пусковые установки, и используйте .desktop files. Эта спецификация уже определяет опцию Terminal, которая именно то, что вы ищете.

+0

Я старался избегать файлов .desktop, которые подходят только по той причине, о которой вы говорили: все остальные делали это так, чтобы обозначить и прочесть. Моя попытка - индексировать настраиваемые установки и любые исполняемые файлы, которые я нахожу в PATH. Я буду смешивать ваше утверждение с тем, что я делаю. В некоторых местах, таких как/bin,/sbin и/usr/sbin, обычно используются консольные утилиты, поэтому можно с уверенностью предположить это. – Eduardo

+0

В моей системе (поле Gentoo, которое не содержит много дополнительных двоичных файлов), ''/usr/sbin/latencytop'' и ''/usr/sbin/pppgetpass.gtk'' обе ссылаются на '' libQtGui.so .4''. –

+0

Спасибо за ваше наблюдение, на самом деле/​​usr/sbin на некоторых машинах, к которым у меня есть доступ, есть много программного обеспечения gui (Debian и Arch) – Eduardo

Смежные вопросы