电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

全面解读 startx


发布日期:2021/9/5
 

总览

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

上一篇:ORA-600(17069)错误的解决过程

下一篇:查看哪些session正在使用哪些回滚段?