2013-06-18 68 views
0

我製作了一個C程序,在某些時候它調用了它的python GUI。從用root用戶運行的C程序啓動Python GUI

當我用sudo在桌面上運行C和python時,它的工作原理是sudo正在以我的用戶身份執行C程序。

但是,我在系統啓動時啓動了C代碼,因此它正在被root用戶執行,然後我無法在桌面上顯示Python GUI,因爲我得到了WARNING **: Could not open X display

C代碼使用inotify觀察二進制文件,並在打開二進制文件時執行一些工作,並通過簡單的system調用打開Python GUI。

C代碼必須以root權限執行,但是python GUI可以以普通用戶身份啓動,當它需要它時,可能使用polkit來獲取它。它只需在/ var/lib中放置的xml文件中寫入一些內容。

任何想法我可以做到這一點?

回答

0

第一種方式運行它的原因是在啓動C程序之前已經設置了DISPLAY環境變量,並且它將被子進程繼承。

如果你要創辦於啓動時的C程序中,DISPLAY變量(可能)不會設置,所以你需要產卵子之前設置它,喜歡的東西......

#include <stdlib.h> 

setenv("DISPLAY", something, 1); 
// Now launch the Python script 

棘手的問題是something。假設C程序與X11會話在同一個系統上運行,它需要從常規X11會話中執行echo $DISPLAY時得到的任何結果。

您必須硬編碼一個可用的值,或者找到某種方法將正確的值傳遞給C程序。


更新

關於權限問題 - 一個簡單的解決方法將是把xhost +root~/.xsession,假設你信任的根。

否則,您可以強制Python腳本作爲您的UID運行。您可以執行正確的fork-exec操作,並在調用exec()之前在子進程中調用setuid(2),或者在Python腳本的頂部調用os.setuid()

+0

顯示器可以硬編碼爲:0,但如果我以前不執行'xhost +',它不起作用,並且我無法從C代碼執行該命令,因爲它以root權限運行? – codiaf

+0

@ user712533查看更新後的答案。 – Aya

+0

如果您以root用戶身份運行該命令,則應該可以告訴它使用您的X授權。在調用啓動應用程序的'system()'之前,將'XAUTHORITY'環境變量設置爲「/pathto/user/homedir/.Xauthority」。這應該足以代替使用'xhost'命令。 –

相關問題