2011-12-09 204 views
0

我在用C編寫的Linux守護進程啓動firefox時遇到了一些問題。 當我使用/usr/bin/firefox從命令shell啓動機器上的firefox(通過終端)時可以正常工作,並且firefox瀏覽器窗口按照應該的方式啓動。如何在Linux下從C程序/守護進程啓動firefox

但是,如果我在我的C守護進程中使用system("/usr/bin/firefox")嘗試此操作,那麼firefox會在終端中啓動它的進程,但瀏覽器窗口未打開?

當我嘗試使用遠程終端訪問來執行此操作時,會發生類似的情況。這是告訴系統在窗口模式下打開Firefox而不是試圖在終端模式下打開它的事情 - 但我不知道如何使用bash命令指定它?

我在我的Linux系統中使用Lubuntu 11.10。
任何幫助最受讚賞。

+0

你爲什麼要將FireFox作爲守護進程啓動? Firefox需要一個終端來操作,並且守護進程沒有連接到終端進程。你想在後臺下載網址嗎?你應該看看[Curl](http://curl.haxx.se/docs/manual.html)或[Wget](http://www.gnu.org/software/wget/manual/wget.html)。 –

+0

@David:我不認爲'firefox'需要一個終端。我用'dmenu'啓動我的'firefox','ps ux'輸出顯示'firefox'沒有控制終端。似乎工作正常。 – sarnold

回答

0

確保在守護程序中正確設置了DISPLAY環境變量,以引用您希望firefox使用的X服務器。

如果守護程序作爲與擁有您要使用的X服務器的用戶帳戶不同的用戶帳戶運行,則還需要使用xauth(1)來配置身份驗證令牌以授予使用X的權限服務器。

很多時候,它是更容易使用ssh -X隧道X 比嘗試管理xauth(1)令牌自己一氣呵成正確配置xauth(1)令牌。也許將ssh -X添加到您的環境中可能適合,也許不適合。 (我甚至當我需要運行一個X客戶端爲root用過ssh -X [email protected],不想與手動配置xauth(1)打擾。ssh(1)就是這麼容易得多。)

+0

感謝球員 凱文當我嘗試你的建議我得到的響應「沒有指定的顯示」? – Colmiler

+0

使用遠程SSH訪問和設置DISPLAY =:0我得到「無指定顯示」錯誤? David W - 我的守護程序有多個用戶控制選項,其中一個是在守護程序啓動後能夠啓動Firebox瀏覽器。 在本地機器上鍵入env也會給出DISPLAY = 0,但是如果我嘗試從我的C守護進程中執行此係統(「/ usr/bin/firefox -display =:0」)不起作用? – Colmiler

1

火狐需要知道哪些顯示它應該打開。當你從gui中運行它時,即使通過終端仿真器,DISPLAY環境變量也被設置爲適當的值。從守護進程啓動時,請嘗試system("/usr/bin/firefox -display=:0")

1

有一個原因,我問你爲什麼試圖做你想做的。我不想在我的評論中看到很多細節。

Unix上的Firefox是一個X-Window進程(大部分Linux/Unix桌面都基於X11協議,這是X-Window的核心)。 X-Window所做的是將程序的顯示與運行程序的進程分開。例如,我現在在工作時正在Linux框中運行Firefox,但Linux框實際上是在我的Mac上在家中顯示Firefox瀏覽器窗口。

爲了做到這一點,我必須:

  • 運行X11在我的Mac。 X11程序創建了一個名爲0.0的默認X11客戶端顯示屏,它幾乎說明了第一個屏幕和X11運行的第一個實例(計算機愛好者從零開始計數)。該進程在我的Mac上在後臺運行。在某種意義上,它確實是一個服務器進程,而不是客戶端,因爲它正在端口6000上等待客戶端 X11進程(Firefox)告訴它該做什麼。
  • 在我運行firefox之前,我必須告訴我的Mac的X11進程,我授予運行Firefox的X11服務器能夠顯示在我的X11客戶端進程上。否則,您可以想象有人通過在顯示屏上不斷彈出Windows來發送垃圾郵件。您可以使用xhost程序來執行此操作。
  • 爲了在Linux上運行Firefox,我已經告訴Firefox進程我正在運行它的X11客戶端。我可以通過將DISPLAY環境變量設置爲「10.0.1.33:0.0」來實現。這意味着X11客戶端正在運行IP地址爲10.0.1.33的計算機,並且我希望您使用該屏幕上的第一個屏幕以及X11客戶端的第一個實例。
  • 現在,我可以在我的Linux機器上運行Firefox,並且顯示器將顯示在我的Mac上。

您遇到的問題是,當您將FireFox作爲守護進程啓動時,根本沒有X11客戶端。 X11客戶端與用戶和某種顯示相關聯。顯示器可以是虛擬顯示器,但必須有一個運行中的X11客戶端,並且可以通過某種方式進行尋址,因此該進程知道在哪裏顯示輸出。

順便說一句,你說守護進程它在Unix/Linux中有非常非常具體的含義。守護進程是一個在後臺運行的進程,通常有一個服務(和一個端口)與之關聯。例如,有一個叫做ftpd的FTP守護進程,郵件服務器使用sendmail守護進程,ssh有sshd守護進程。守護進程沒有與它們關聯的顯示。

但是,看起來你可能會用這個詞來表示通過另一個進程啓動Firefox。真的嗎?如果是這樣,你必須確保Firefox知道要使用的X11顯示器(有一個用於指定顯示器的命令行設置),並且X11客戶端(您的登錄會話)已授予其他進程更新的權限您的顯示與程序窗口。

你能解釋一下你想要做的更詳細一點嗎?如果您只是想從遠程http服務器下載文件(當然這正在運行http守護程序進程httpd),則應使用curlwget,這些程序不需要顯示並且使用起來更簡單。如果您正在嘗試做其他事情,請告訴我們究竟是什麼。

+0

非常感謝David W的解釋。我對Linux很新,有很多東西需要學習。基本上我使用基於Lubuntu的機器運行apache2服務器,我的守護進程在啓動時運行,作爲將串行數據記錄到sqlite數據庫的後臺進程。操作員界面通過遠程或本地的Firefox瀏覽器(通過apache2服務器)。有些選項不需要在本地框上運行firefox,但是如果他們這樣做,我想從啓動時從我的守護進程啓動它,並從squlite表中讀取它的配置。我將研究如何從守護進程啓動X11客戶端。 – Colmiler

+0

PS:我更喜歡通過我的守護進程啓動firefox,因爲它有一些配置和功能與操作員接口(通過運行在我的apache2服務器上的Ajax/php代碼)。據我所知,我會將它作爲守護進程分類,因爲它沒有終端接口,但每秒都收集/記錄數據,併爲在apache2服務器上運行的php代碼提供共享內存接口,並且它是整個系統。可能我可以從另一個/etc/init.d/腳本啓動firefox,但是之後我需要再次讀取我的數據庫文件? – Colmiler

+0

查看用於Unix/Linux的各種[VNC](http://www.google.com/search?client=safari&rls=en&q=vnc+client&ie=UTF-8&oe=UTF-8)客戶端。這些客戶端創建一個虛擬的X11顯示器。將這些客戶端作爲後臺進程運行也是可能的,然後當你想看到它時能夠在顯示器上顯示_peek_。 –