X protocol就是X server于X client之间通信的协议了。X protocol支持现在常用的网络通信协议。我只能测试TCP/IP,可以看到X server侦听在tcp 6000端口上。那X protocol就是位于运输层以上了,应该属于应用层吧?。 总结下运行过程吧: (1) 用户通过鼠标键盘对X server下达操作命令 (2) X server利用Event传递用户操作信息给X client (3) X client进行程序运算 (4) X client利用Request传回所要显示的结果 (5) X server将结果显示在屏幕上
#如果用户client文件存在则使用用户文件里定义的client,否则使用系统定义的client if [ -f $userclientrc ]; then defaultclientargs=$userclientrc elif [ -f $sysclientrc ]; then defaultclientargs=$sysclientrc fi
#如果用户server文件存在则使用用户文件里定义的server,否则使用系统定义的server if [ -f $userserverrc ]; then defaultserverargs=$userserverrc elif [ -f $sysserverrc ]; then defaultserverargs=$sysserverrc fi
#下面循环处理client和server的参数 whoseargs="client" while [ x"" != x ]; do #若第一个参数为空,退出循环 case "" in # '' required to prevent cpp from treating "/*" as a C comment. /''*|./''*) #如果是/*或者./*形式(xinit程序要求其参数里的client程序和server程序必须以/或./开头,否则会被视为client程序和server程序的参数,见man xinit) if [ "$whoseargs" = "client" ]; then #如果当前是在处理client的参数 if [ x"$clientargs" = x ]; then #如果clientargs为空,则赋值给client变量,也即上面#startx使用方法里的[client]参数 client="" else clientargs="$clientargs " #否则clientargs赋值为$clientargs ,即上面#startx使用#方法里的options参数 fi else #当前在处理server的参数,代码的含义同上 if [ x"$serverargs" = x ]; then server="" else serverargs="$serverargs " fi fi ;; --)#如果为--,则表示开始处理server的参数,--为client和server参数的分界 whoseargs="server" ;; *) if [ "$whoseargs" = "client" ]; then #处理给client程序的参数 clientargs="$clientargs " else #处理给server程序的参数 # display must be the FIRST server argument #屏幕编号必须为第一个给server程序的参数,以的形式(x为数字),这可从上面startx和xinit 的使用 #方法的区别看出,xinit多了个[display],这里即过滤出这个[display]。试试看这两个命令: #xinit /usr/bin/X11/xeyes -display localhost:1 -- /usr/bin/X11/X :1 -dpi 70& #xinit /usr/bin/X11/xeyes -display localhost:1 -- /usr/bin/X11/X -dpi 70 :1& #即可看出不把屏幕编号作为第一个server参数的后果 if [ x"$serverargs" = x ] && expr "" : ':[0-9][0-9]*$' > /dev/null 2>&1; then display="" else #处理屏幕编号以外的参数 serverargs="$serverargs " fi fi ;; esac shift #所有参数左移一次 done
# process client arguments if [ x"$client" = x ]; then #如果client程序为空 # if no client arguments either, use rc file instead if [ x"$clientargs" = x ]; then #且clientargs为空,赋值$defaultclientargs给client程序 client="$defaultclientargs" else client=$defaultclient #使用默认的client程序 fi fi
# process server arguments处理server参数,同上 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 #…………省略授权代码若干
SESSIONFILES=$(run_parts $SYSSESSIONDIR) if [ -n "$SESSIONFILES" ]; then for SESSIONFILE in $SESSIONFILES; do . $SESSIONFILE done fi exit 0
接着看run_parts(),位于本文件中间: run_parts () { # until run-parts --noexec is implemented if [ -z "" ]; then internal_errormsg "run_parts() called without an argument." fi
if [ ! -d "" ]; then internal_errormsg "run_parts() called, but "" does not exist or is" "not a directory." fi
for F in $(ls ); do if expr "$F" : '[[:alnum:]_-]+$' > /dev/null 2>&1; then if [ -f "/$F" ]; then echo "/$F" fi fi done }
大概意思就是run_parts () 把$SYSSESSIONDIR目录下的文件名取出来赋值给$SESSIONFILES,然后循环运行该目录下的文件。看看该目录,即 /etc/X11/Xsession.d目录,可以看到几个以数字开头的文件,实际上这些数值就表示了这几个文件被运行的优先级,数字小的优先级高,因为在上面的run_parts () 里是用ls命令显示该目录下的文件,所以前面数字小的被ls时显示在前面,所以被 for SESSIONFILE in $SESSIONFILES; do . $SESSIONFILE done
这个for循环执行时也先被执行。看到/etc/X11/Xsession.d目录下有个55gnome-session_gnomerc文件,里面提到了STARTUP变量。然后运行: xdkui@Debian:/etc/X11/Xsession.d$ grep STARTUP * 看到50xfree86-common_determine-startup文件。里面有 if [ -z "$STARTUP" ]; then if [ -x /usr/bin/x-session-manager ]; then STARTUP=x-session-manager elif [ -x /usr/bin/x-window-manager ]; then STARTUP=x-window-manager elif [ -x /usr/bin/x-terminal-emulator ]; then STARTUP=x-terminal-emulator fi fi