LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 8357|回复: 10

解读startx

[复制链接]
发表于 2003-6-9 00:01:50 | 显示全部楼层 |阅读模式
总览:

startx 只是xinit的一个前端工具,它所做的只是设置好一些变量,资源。然后再用xinit 启动X window.
xinit的命令格式:
xinit [ [client] clientargs] [-- [server] [display] serverargs]

startx所做的工作:
一.获取命令行参数
1.client段
clientargs:
完全从命令行中获取,无默认值

client:
如果没有指定,但是已经指定clientargs,则使用/usr/X11R6/bin/xterm
如果没有指定,且没有指定clientargs,则使用./defaultclientargs,即按以下顺序取值:
$HOME/.xinitrc -> /usr/X11R6/lib/X11/xinit/xinitrc

/usr/X11R6/lib/X11/xinit/xinitrc其实就是执行/etc/X11/Xsessions这个脚本
而/etc/X11/Xsession又会检查$HOME/.xsession,如果存在则把它作为client.
所以如果$HOME/.xinitrc不存在时,它可以使用$HOME/.xsession;而当$HOME/.xinitrc存在
时,它并不会使用$HOME/.xsession
2.server段
跟client类似

增加一个display的设置,默认为":0"

二.设置标志认证
三.通过xinit启动X
四.关闭X时,进行一些收尾工作。

对xinit来说,如果没有指定client,则使用$HOME/.xinitrc,如果这个也不存在则使用xterm;如果没有指定server,则使用$HOME/.xserverc,如果这这个不存在的话则使用X :0。

所以当由startx启动X时
client的顺序是: 命令行 -> $HOME/.xinitrc -> $HOME/.xsession -> /usr/X11R6/lib/X11/xinit/xinitrc
server的顺序是: 命令行 -> $HOME/.xserverrc -> /usr/X11R6/lib/X11/xinit/xserverrc

以上"->"表示:当前一个不存在时,则取下面一个,直到存在。


  1. #!/bin/sh

  2. # $Xorg: startx.cpp,v 1.3 2000/08/17 19:54:29 cpqbld Exp $
  3. #
  4. # This is just a sample implementation of a slightly less primitive
  5. # interface than xinit.  It looks for user .xinitrc and .xserverrc
  6. # files, then system xinitrc and xserverrc files, else lets xinit choose
  7. # its default.  The system xinitrc should probably do things like check
  8. # for .Xresources files and merge them in, startup up a window manager,
  9. # and pop a clock and serveral xterms.
  10. #
  11. # Site administrators are STRONGLY urged to write nicer versions.
  12. #
  13. # $XFree86: xc/programs/xinit/startx.cpp,v 3.12.2.2 2002/01/28 18:27:34 tsi Exp $

  14. #注意:xinit 的参数格式:
  15. #xinit $client $clientargs -- $server $display $serverargs
  16. #各个参数的特点:
  17. #client必须是以"/"或者"./"开头。因为client其实就是一个程序,所以他是由路径来指出

  18. #第一个clientargs不能是以"/"或者"./"开头的。
  19. #对于server跟serverargs的区别也是类似的。
  20. #而display跟serverargs的区别
  21. #display是第一个以":??"(??代表两个数字)开头的字符串。

  22. userclientrc=$HOME/.xinitrc
  23. userserverrc=$HOME/.xserverrc
  24. sysclientrc=/usr/X11R6/lib/X11/xinit/xinitrc
  25. sysserverrc=/usr/X11R6/lib/X11/xinit/xserverrc
  26. defaultclient=/usr/X11R6/bin/xterm
  27. defaultserver=/usr/X11R6/bin/X
  28. defaultclientargs=""
  29. defaultserverargs=""
  30. clientargs=""
  31. serverargs=""





  32. #===================参数配置文件================
  33. if [ -f $userclientrc ]; then
  34.     defaultclientargs=$userclientrc
  35. elif [ -f $sysclientrc ]; then
  36.     defaultclientargs=$sysclientrc
  37. fi




  38. if [ -f $userserverrc ]; then
  39.     defaultserverargs=$userserverrc
  40. elif [ -f $sysserverrc ]; then
  41.     defaultserverargs=$sysserverrc
  42. fi

  43. #接收命令行参数
  44. whoseargs="client"
  45. #谁的参数--之前是client的参数,--之后是server的参数。
  46. while [ x"$1" != x ]; do
  47. case "$1" in
  48.     # '' required to prevent cpp from treating "/*" as a C comment.
  49.     /''*|\./''*)
  50. #这个参数是以"/"或者"./"开头
  51.         if [ "$whoseargs" = "client" ]; then
  52.             if [ x"$clientargs" = x ]; then
  53.            # 如果clientargs为空,说明这个参数是从命令行传入的第一个参数
  54.            # 故它应该是client
  55.                 client="$1"
  56.             else
  57.                 clientargs="$clientargs $1"
  58.             fi
  59.         else
  60.             if [ x"$serverargs" = x ]; then
  61.             #为什么这里不用display是否为空来判断呢?
  62.             #因为display可以省略,这时则不能正确判断了。
  63.                 server="$1"
  64.             else
  65.                 serverargs="$serverargs $1"
  66.             fi
  67.         fi
  68.         ;;
  69.     --)
  70.         whoseargs="server"
  71.         ;;
  72.     *)  
  73.         if [ "$whoseargs" = "client" ]; then
  74.             clientargs="$clientargs $1"
  75.         else
  76.             # display must be the FIRST server argument
  77.             if [ x"$serverargs" = x ] &&                 expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then
  78. #如果serverargs为空,并且$1是以":"跟数字组成,即为display参数。
  79.                 display="$1"
  80.             else
  81.                 serverargs="$serverargs $1"
  82.             fi
  83.         fi      
  84.         ;;  
  85.     esac        
  86.     shift   
  87. done   
  88. #命令行参数接收完毕。
  89.    
  90. # process client arguments
  91. if [ x"$client" = x ]; then
  92.     # if no client arguments either, use rc file instead
  93.     if [ x"$clientargs" = x ]; then
  94.         client="$defaultclientargs"
  95.     else
  96.         client=$defaultclient
  97.     fi
  98. fi

  99. # process server arguments
  100. if [ x"$server" = x ]; then
  101.     # if no server arguments or display either, use rc file instead
  102.     if [ x"$serverargs" = x -a x"$display" = x ]; then
  103.         server="$defaultserverargs"
  104.     else
  105.         server=$defaultserver
  106.     fi
  107. fi

  108. if [ x"$XAUTHORITY" = x ]; then
  109.     XAUTHORITY=$HOME/.Xauthority
  110.     export XAUTHORITY
  111. fi  
  112.    
  113. removelist=
  114.    
  115.         
  116. # set up default Xauth info for this machine

  117. # check for GNU hostname
  118. if hostname --version > /dev/null 2>&1; then
  119.         if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then
  120.                 hostname=`hostname -f`
  121.                 #long hostname
  122.         fi
  123. fi  
  124.         
  125. if [ -z "$hostname" ]; then
  126.         hostname=`hostname`
  127. fi
  128. #以上是设置hostname
  129.    
  130. #添加X标记认证。
  131. authdisplay=${display:-:0}
  132. #设置要验证的显示,如果display已经设置则取display的值;
  133. #如果display没有设置,则取:0
  134. mcookie=`mcookie`
  135. for displayname in $authdisplay $hostname$authdisplay; do
  136.     if ! xauth list "$displayname" | grep "$displayname " >/dev/null 2>&1; then
  137.     #没有xauth认证,需要添加。
  138.         xauth add $displayname . $mcookie
  139.         removelist="$displayname $removelist"
  140.     fi
  141. done

  142. #启动X window
  143. xinit $client $clientargs -- $server $display $serverargs

  144. #关闭X window时
  145. if [ x"$removelist" != x ]; then
  146. #删除标记认证
  147.     xauth remove $removelist
  148. fi

  149. #释放不用的虚拟终端所占用的资源
  150. if command -v deallocvt > /dev/null 2>&1; then
  151.     deallocvt
  152. fi

复制代码


由于本人对X机制也不是很了解,所以错误在所难免,欢迎大家指正。
有关xauth部分,请参阅:http://thunder.prohosting.com/~bricks/linux/x11/Xsafe.htm#5.1
 楼主| 发表于 2003-6-9 00:07:48 | 显示全部楼层
没这么快吧,才刚刚发贴不到2分钟就成精华了?
呵呵
发表于 2003-6-9 00:09:19 | 显示全部楼层
确实是学习脚本的好教材!
发表于 2003-6-9 00:14:27 | 显示全部楼层
好东西,不置精华怪可惜的!
再说,我看startx的时候,有些疑惑的地方,看了兄弟的解释,明白了许多!谢谢兄弟!;)
 楼主| 发表于 2003-6-9 00:32:27 | 显示全部楼层
错误之处还烦兄弟指出
发表于 2003-6-9 08:04:39 | 显示全部楼层
好文
发表于 2003-6-10 09:45:06 | 显示全部楼层
呵呵,我昨天升级Debian的unstable,结果估计是包之间的匹配关系造成了X认证出错,fvwm无法启动。
于是,我直接xinit就启动了。
发表于 2003-6-10 16:13:02 | 显示全部楼层

回复: 解读startx

最初由 pupilzeng 发表
1.client段
clientargs:
完全从命令行中获取,无默认值

client:
如果没有指定,但是已经指定clientargs,则使用/usr/X11R6/bin/xterm
如果没有指定,且没有指定clientargs,则使用./defaultclientargs,即按以下顺序取值:
$HOME/.xinitrc -> /usr/X11R6/lib/X11/xinit/xinitrc

/usr/X11R6/lib/X11/xinit/xinitrc其实就是执行/etc/X11/Xsessions这个脚本
而/etc/X11/Xsession又会检查$HOME/.xsession,如果存在则把它作为client.
所以如果$HOME/.xinitrc不存在时,它可以使用$HOME/.xsession;而当$HOME/.xinitrc存在
时,它并不会使用$HOME/.xsession


这里我有些不理解,如果没有指定client,并且没有指定clientargs,那么是“先找$HOME/.xinitrc,然后再找/usr/X11R6/lib/X11/xinit/xinitrc”呢,还是“先找$HOME/.xinitrc,如果找到,就不再找/usr/X11R6/lib/X11/xinit/xinitrc”呢?
 楼主| 发表于 2003-6-10 18:16:54 | 显示全部楼层
先找$HOME/.xinitrc,如果找到,就不再找/usr/X11R6/lib/X11/xinit/xinitrc

我最后说了这一句:
以上"->"表示:当前一个不存在时,则取下面一个,直到存在。
就是说,只要前面的存在了,就不找后面的了,不存在的时候,才一路找下去
发表于 2003-6-10 23:24:18 | 显示全部楼层
最初由 pupilzeng 发表
先找$HOME/.xinitrc,如果找到,就不再找/usr/X11R6/lib/X11/xinit/xinitrc

我最后说了这一句:
以上"->"表示:当前一个不存在时,则取下面一个,直到存在。
就是说,只要前面的存在了,就不找后面的了,不存在的时候,才一路找下去

噢……谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表