总览 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/# |