簡體   English   中英

確定程序是Linux中的GUI還是控制台應用程序

[英]Determine whether a program is a GUI or console application in Linux

我使用Qt-4作為框架在C ++中編程,給定一個目錄(即/ usr / bin)我想知道該程序是GUI還是控制台應用程序。

我發現了一些關於如何使用這個窗口的信息,以及關於Linux(在elf內)中類似(到Win)標識的不存在的信息。 有沒有其他方法可以在Linux上執行此操作?

我想:

  • 使用QProcess生成每個條目並監視它的生命周期,假設控制台應用程序需要一些輸入,而我沒有提供任何輸入,它會打印出一條幫助消息並退出。 如果它在x秒后仍然存在,我會殺死進程並將其標記為包含gui。 這是一種可怕的方法,容易出錯;
  • 運行ldd並解析任何libX或其他的輸出。 這似乎是一種更好的方法,盡管firefox例如沒有被標記為擁有gui。

EDIT0:這個項目是一個應用程序啟動器

編輯1:一旦我有分類的程序列表,我可以在用戶選擇非圖形應用程序時啟動終端模擬器

定論:

在人們回答並進行額外搜索之后,實際上無法可靠地辨別控制台和gui應用程序。 我最好的辦法是做一些考慮,例如搜索.desktop文件,做一些假設,比如在/ bin,/ sbin和/ usr / sbin等實用程序中列出的工具。

也許為每個找到的條目解析ldd的輸出。

謝謝。

程序可以嘗試作為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一樣的異常。

如果您正在編寫(又一個)應用程序啟動器,請按照創建所有其他應用程序啟動程序的人員的操作並使用.desktop文件 該規范已經定義了Terminal選項,這正是您正在尋找的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM