2012-08-29 53 views
1

我想以編程方式查找連接到控制檯的X服務器,意思是當前由鼠標/鍵盤/屏幕控制。 我認爲有一個乾淨的方式來獲取當前的VT(使用/dev/console?)。 fgconsolecode(fgconsole.c,getfd.c)讓我有些懷疑。 雖然獲取前臺控制檯/找到活動X服務器

struct vt_stat vtInfo; 
ioctl(fdConsole, VT_GETSTATE, &vtInfo); 

似乎是我想要的,提取的合法控制檯FD的代碼似乎有點不可靠的 - 雖然5個文件進行了測試(RW/W/R每個),它仍然失敗,如果稱爲終端內部仿真(xterm)。我可以忍受這一點,但它並不真的感覺良好...... (注意:當然,xterm不能成爲控制檯 - 我們正在討論在xterm中查詢fgconsole)。

接下來,我必須將vt(例如vt7)映射到X顯示器。 不過,我寧願不依賴於

ps aux | grep X 

來實現這一目標?有沒有更可靠的方法? 我可以連接到/tmp/.X11-unix/中列出的所有X服務器並詢問他們有關他們的vt嗎? 甚至直接獲得他們的控制檯('主動')狀態?我找不到用Xlib做這件事的一個明顯的方法,可能是因爲X服務器API對vts是不可知的,但是可能有這樣的擴展嗎?

感謝您的幫助!

回答

0

我喜歡/proc fs :)它似乎提供了我需要的一切。在/tmp/.X11-unix/我還沒施放此爲C代碼,但這應該工作還不錯::(0。他們的名字,例如

  • 查找開放的X顯示器
  • 尋找在的/ proc /淨/ UNIX這些插座,讓他們的inode
  • 尋找在過程的/ proc/[PID]有開放的一個VT/ls -la /proc/*/fd/ | grep /dev/tty - 如果他們也有一個它們的打開文件描述符中的套接字inode,它們應該是X服務器,否則是tty 。當然,/proc/[PID]/exe有幫助,但可能不太可靠。

cat /proc/net/unix | grep -a '/tmp/.X11-unix/X'輸出表明,總有形式/tmp/.X11-unix/X0的插座和許多形式@/tmp/.X11-unix/X0(注意@)的。我想知道是否存在一個保存假設,即總是隻有一個進程(X服務器)正在監聽前者。