熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

全面解讀 startx

2013-11-13 16:04:52  來源: Oracle 

  總覽
  startx 只是xinit的一個前端工具它所做的只是設置好一些變量資源然後再用xinit 啟動X window
  xinit的命令格式
  xinit [ [client] clientargs] [ [server] [display] serverargs]
  startx所做的工作:
  一獲取命令行參數
  client段
  clientargs:
  完全從命令行中獲取無默認值
  client:
  如果沒有指定但是已經指定clientargs則使用/usr/XR/bin/xterm
  如果沒有指定且沒有指定clientargs則使用/defaultclientargs即按以下順序取值
  $HOME/xinitrc > /usr/XR/lib/X/xinit/xinitrc
  /usr/XR/lib/X/xinit/xinitrc其實就是執行/etc/X/Xsessions這個腳本
  而/etc/X/Xsession又會檢查$HOME/xsession如果存在則把它作為client
  所以如果$HOME/xinitrc不存在時它可以使用$HOME/xsession;而當$HOME/xinitrc存在
  時它並不會使用$HOME/xsession
  server段
  跟client類似
  增加一個display的設置默認為:
  二設置標志認證
  三通過xinit啟動X
  四關閉X時進行一些收尾工作
  對xinit來說如果沒有指定client則使用$HOME/xinitrc如果這個也不存在則使用xterm如果沒有指定server則使用$HOME/xserverc如果這這個不存在的話則使用X :
  所以當由startx啟動X時
  client的順序是: 命令行 > $HOME/xinitrc > $HOME/xsession > /usr/XR/lib/X/xinit/xinitrc
  server的順序是: 命令行 > $HOME/xserverrc > /usr/XR/lib/X/xinit/xserverrc
  以上>表示當前一個不存在時則取下面一個直到存在
  源碼:
  #!/bin/sh
  # $Xorg: startxcppv // :: cpqbld Exp $
  #
  # This is just a sample implementation of a slightly less primitive
  # interface than xinit It looks for user xinitrc and xserverrc
  # files then system xinitrc and xserverrc files else lets xinit choose
  # its default The system xinitrc should probably do things like check
  # for Xresources files and merge them in startup up a window manager
  # and pop a clock and serveral xterms
  #
  # Site administrators are STRONGLY urged to write nicer versions
  #
  # $XFree: xc/programs/xinit/startxcppv // :: tsi Exp $
  #注意xinit 的參數格式:
  #xinit $client $clientargs $server $display $serverargs
  #各個參數的特點
  #client必須是以/或者/開頭因為client其實就是一個程序所以他是由路徑來指出
  的
  #第一個clientargs不能是以/或者/開頭的
  #對於server跟serverargs的區別也是類似的
  #而display跟serverargs的區別
  #display是第一個以:??(??代表兩個數字)開頭的字符串
  userclientrc=$HOME/xinitrc
  userserverrc=$HOME/xserverrc
  sysclientrc=/usr/XR/lib/X/xinit/xinitrc
  sysserverrc=/usr/XR/lib/X/xinit/xserverrc
  defaultclient=/usr/XR/bin/xterm
  defaultserver=/usr/XR/bin/X
  defaultclientargs=
  defaultserverargs=
  clientargs=
  serverargs=
  #===================參數配置文件================
  if [ f $userclientrc ]; then
   defaultclientargs=$userclientrc
  elif [ f $sysclientrc ]; then
  defaultclientargs=$sysclientrc
  fi
  if [ f $userserverrc ]; then
  defaultserverargs=$userserverrc
  elif [ f $sysserverrc ]; then
  defaultserverargs=$sysserverrc
  fi
  #接收命令行參數
  whoseargs=client
  #誰的參數之前是client的參數之後是server的參數
  while [ x$ != x ]; do
  case $ in
   # required to prevent cpp from treating /* as a C comment
   /*|\/*)
  #這個參數是以/或者/開頭
   if [ $whoseargs = client ]; then
   if [ x$clientargs = x ]; then
   # 如果clientargs為空說明這個參數是從命令行傳入的第一個參數
   # 故它應該是client
   client=$
   else
   clientargs=$clientargs $
   fi
   else
   if [ x$serverargs = x ]; then
   #為什麼這裡不用display是否為空來判斷呢?
   #因為display可以省略這時則不能正確判斷了
   server=$
   else
   serverargs=$serverargs $
   fi
   fi
   ;;
   )
   whoseargs=server
   ;;
   *)
   if [ $whoseargs = client ]; then
   clientargs=$clientargs $
   else
   # display must be the FIRST server argument
   if [ x$serverargs = x ] && expr $ : :[][]*$ > /dev/null >&; then
  #如果serverargs為空並且$是以:跟數字組成即為display參數
   display=$
   else
   serverargs=$serverargs $
   fi
   fi
   ;;
   esac
   shift
  done
  #命令行參數接收完畢
  # process client arguments
  if [ x$client = x ]; then
   # if no client arguments either use rc file instead
   if [ x$clientargs = x ]; then
  client=$defaultclientargs
   else
   client=$defaultclient
   fi
  fi
  # process server arguments
  if [ x$server = x ]; then
   # if no server arguments or display either use rc file instead
   if [ x$serverargs = x a x$display = x ]; then
   server=$defaultserverargs
   else
   server=$defaultserver
   fi
  fi
  if [ x$XAUTHORITY = x ]; then
  XAUTHORITY=$HOME/Xauthority
   export XAUTHORITY
  fi
  removelist=
  # set up default Xauth info for this machine
  # check for GNU hostname
  if hostname version > /dev/null >&; then
   if [ z `hostname version >& | grep GNU` ]; then
   hostname=`hostname f`
   #long hostname
   fi
  fi
  
  if [ z $hostname ]; then
   hostname=`hostname`
  fi
  #以上是設置hostname
  #添加X標記認證
  authdisplay=${display::}
  #設置要驗證的顯示如果display已經設置則取display的值
  #如果display沒有設置則取:
  mcookie=`mcookie`
  for displayname in $authdisplay $hostname$authdisplay; do
   if ! xauth list $displayname | grep $displayname >/dev/null >&; then
   #沒有xauth認證需要添加
   xauth add $displayname $mcookie
   removelist=$displayname $removelist
   fi
  done
  #啟動X window
  xinit $client $clientargs $server $display $serverargs
  #關閉X window時
  if [ x$removelist != x ]; then
  #刪除標記認證
   xauth remove $removelist
  fi
  #釋放不用的虛擬終端所占用的資源
  if command v deallocvt > /dev/null >&; then
   deallocvt
  fi
  由於本人對X機制也不是很了解所以錯誤在所難免歡迎大家指正
  有關xauth部分請參閱~bric/#
From:http://tw.wingwit.com/Article/program/Oracle/201311/17774.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.