2016-01-19 45 views
1

我有一個C++程序,它採用我的Ubuntu 14.04機器的屏幕截圖。該程序使用X11庫。我需要在啓動時從守護進程執行這個應用程序。但它返回XOpenDisplay failed。我認爲這是因爲X11服務器沒有加載。有沒有任何編程方式,我可以在加載X11服務器後立即獲取屏幕截圖?使用C++獲取linux機器的屏幕截圖

編輯:

錯失告訴東西..守護程序被在系統啓動時啓動,它沒有采取截圖。所以開始後,我停止守護進程並從終端再次啓動它。然後顯示相同的錯誤(XOpenDisplay失敗)..是否有一個屏幕截圖和守護進程的問題?

+0

一個while循環延遲並每1000ms再次嘗試一次? – Marged

+2

當程序運行並且DISPLAY環境變量正確設置時,X服務器是否已經運行? – jofel

+0

它是相關的,該程序是C++?如果沒有,至少可以從標題和標籤中刪除它,以便更好地爲觀衆提供問題。 – hyde

回答

4

這不僅僅是等待X服務器啓動的問題。要成功連接到它:

  • X服務器必須正在運行。
  • 程序必須知道它的地址才能連接到它,它通常存儲在DISPLAY環境變量中。
  • 程序必須驗證X服務器,這通常是通過提供一個從一個文件,該文件是可讀的只是誰是當前登錄的用戶讀取X服務器cookie。

所有這些條件都滿足如果您只是將該程序作爲圖形會話的一部分啓動,而不是在啓動後獨立啓動該程序。

有幾種方法可以在圖形會話中實現程序的啓動。一種是將something.desktop文件放入/etc/xdg/autostart目錄。您可以從那裏檢查其他文件的語法。

+0

我試着添加.desktop文件。雖然電話是成​​功的,但沒有結果。我試圖將輸出寫入二進制文件..它是空的 – Jackzz

+0

在圖形會話內手動運行時它能正常工作嗎?如果是,那麼請確保您檢查錯誤,並且可以將它們記錄到文件進行調試。 – michalsrb

+0

手動從圖形會話??你可以解釋它..我的應用程序寫入兩個文件..錯誤文件和輸出文件..兩個文件都創建..錯誤文件告訴沒有error.but輸出文件爲空 – Jackzz

2

/etc/X11/Xsession.d/中添加腳本。該腳本將在X11運行時運行。

如果您確實需要在啓動時啓動守護進程,那麼您可以執行的操作是將signal從腳本發送到守護進程。當您啓動守護進程時,您需要將pid存儲在某個地方。

kill -SIGUSR1 $PID 

然後,你的守護進程應該在一開始register a signal handler將要被接收的信號時調用。

雖然拍攝屏幕截圖可能需要動態內存分配,而這是您在信號處理程序中無法做到的事情之一。所以,你需要做的是讓守護進程等待condition variable並讓信號處理程序設置它並通知服務員。

在X11啓動後啓動守護程序比在啓動時啓動要簡單得多。

+0

我加了一個簡單的腳本來運行Xsession.d中的應用程序。它會自動運行嗎? – Jackzz

+0

@Jackzz根據手冊:'/etc/X11/Xsession.d/ 是一個包含Bourne shell腳本的目錄,由 Xsession執行。 – user2079303