Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1052868
  • 博文数量: 836
  • 博客积分: 43880
  • 博客等级: 大将
  • 技术积分: 5485
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-20 17:36
文章分类

全部博文(836)

文章存档

2011年(1)

2008年(835)

我的朋友

分类: LINUX

2008-08-20 18:27:01


一)基本运行原理 XWindowSystem采用C/S结构,但和我们常见的C/S不同。常见的C/S结构中,称提供服务的一方为server,即服务器端(如HTTP服务,FTP服务等),使用服务的称为client,即客户端。但在XWindowSystem中,client是执行程序的一方,在上面执行各种X程序,而server则是负责显示client运行程序的窗口的一方。 XWindowSystem的组成可以分为Xserver,Xclient,Xprotocol三部分。Xserver主要控制输入输出,维护字体,颜色等相关资源。它接受输入设备的输入信息并传递给Xclient,Xclient将这些信息处理后所返回的信息,也由Xserver负责输出到输出设备(即我们所见的显示器)上。Xserver传递给Xclient的信息称为Event,主要是键盘鼠标输入和窗口状态的信息。Xclient传递给Xserver的信息则称为Request,主要是要求Xserver建立窗口,更改窗口大小位置或在窗口上绘图输出文字等。Xclient主要是完成应用程序计算处理的部分,并不接受用户的输入信息,输入信息都是输入给Xserver,然后由Xserver以Event的形式传递给Xclient(这里感觉类似Windows的消息机制,系统接收到用户的输入信息,然后以消息的形式传递给窗口,再由窗口的消息处理过程处理)。Xclient对收到的Event进行相应的处理后,如果需要输出到屏幕上或更改画面的外观等,则发出Request给Xserver,由Xserver负责显示。 常见的情况是Xserver与Xclient都在同一台电脑上运行,但他们也可分别位于网络上不同的电脑上。在XWindowSystem中,Xclient是与硬件无关的,它并不关心你使用的是什么显卡什么显示器什么键盘鼠标,这些只与Xserver相关。我们平常安装完XFree86后运行xf86config或xf86cfg进行的配置实际上只是与Xserver有关,可以说就是配置Xserver吧,不配置照样可以运行Xclient程序(如:xeyes-displayxserver:0就可以在xserver这台机器上的0号屏幕(屏幕编号displaynumber为0)上显示那对大眼睛了)。 Xprotocol就是Xserver于Xclient之间通信的协议了。Xprotocol支持现在常用的网络通信协议。我只能测试TCP/IP,可以看到Xserver侦听在tcp6000端口上。那Xprotocol就是位于运输层以上了,应该属于应用层吧?。 总结下运行过程吧: (1)用户通过鼠标键盘对Xserver下达操作命令 (2)Xserver利用Event传递用户操作信息给Xclient (3)Xclient进行程序运算 (4)Xclient利用Request传回所要显示的结果 (5)Xserver将结果显示在屏幕上 二)启动过程 我们从控制台进入X一般是用startx命令。下面就从startx分析起。首先manstartx和manxinit可以看到staratx和xinit的使用方法:
startx[[client]options.....][--[server]options....]
xinit[[client]options][--[server][display]options]
把上面[client]和[server]分别称为client程序和server程序。man手册里写明其必须以/或者./开头。 下面看看startx这个脚本,中文为我加的注释,这个脚本是安装x-window-system-core后得到的,都是XFree86,不同发行版的linux里该脚本应该大同小异:
#!/bin/sh
userclientrc=$HOME/.xinitrc#用户的client定义文件
userserverrc=$HOME/.xserverrc#用户的server定义文件
sysclientrc=/usr/X11R6/lib/X11/xinit/xinitrc#系统的client
sysserverrc=/usr/X11R6/lib/X11/xinit/xserverrc#系统的server
defaultclient=/usr/X11R6/bin/xterm#默认的client程序
defaultserver=/usr/X11R6/bin/X#默认的server程序
defaultclientargs=""#下面定义了client和server的参数变量
defaultserverargs=""
clientargs=""
serverargs=""
如果用户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
#''''requiredtopreventcppfromtreating"/*"asaCcomment.
/''''*|./''''*)#如果是/*或者./*形式(xinit程序要求其参数里的client程序
和server程序必须以/或./开头,否则会被视为client程序和server程序的参数,
见manxinit)
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程序的参数
#displaymustbetheFIRSTserverargument
#屏幕编号必须为第一个给server程序的参数,以的形式(x为数字),
这可从上面startx和xinit的使用
#方法的区别看出,xinit多了个[display],这里即过滤出这个[display]。试试看这两个命令:
#xinit/usr/bin/X11/xeyes-displaylocalhost:1--/usr/bin/X11/X:1-dpi70&
#xinit/usr/bin/X11/xeyes-displaylocalhost:1--/usr/bin/X11/X-dpi70:1&
#即可看出不把屏幕编号作为第一个server参数的后果
if[x"$serverargs"=x]&&expr"":'':[0-9][0-9]*$''>/dev/null2>&1;then
display=""
else#处理屏幕编号以外的参数
serverargs="$serverargs"
fi
fi
;;
esac
shift#所有参数左移一次
done
#processclientarguments
if[x"$client"=x];then#如果client程序为空
#ifnoclientargumentseither,usercfileinstead
if[x"$clientargs"=x];then#且clientargs为空,赋值$defaultclientargs给client程序
client="$defaultclientargs"
else
client=$defaultclient#使用默认的client程序
fi
fi
#processserverarguments处理server参数,同上
if[x"$server"=x];then
#ifnoserverargumentsordisplayeither,usercfileinstead
if[x"$serverargs"=x-ax"$display"=x];then
server="$defaultserverargs"
else
server=$defaultserver
fi
fi
#…………省略授权代码若干
xinit$client$clientargs--$server$display$serverargs#把处理过的参数交
由xinit程序处理
#…………
由上面代码可以得出startx主要是置Xclient和Xserver所在的位置,并处理相关参数,最后交给xinit处理。可以看出startx设置Xclient的位置是先搜寻$HOME/.xinitrc,然后是/etc/X11/xinit/xinitrc;设置Xserver的位置是先搜寻$HOME/.xserverrc,然后是/etc/X11/xinit/xserverrc。这就解释了我们平常为什么说启动XWindow时用户目录下的.xinitrc和.xserverrc文件优先级要高。所以我们用startx命令启动X时,如果用户目录存在.xinitrc和.xserverrc文件,则实际上等价于命令xinit$HOME/.xinitrc--$HOME/.xserverrc。如果用户目录不存在那两个文件,则等价于xinit/usr/X11R6/lib/X11/xinit/xinitrc--/usr/X11R6/lib/X11/xinit/xserver。别的情况类推。 1 2 3 4 5 下一页>>


下载本文示例代码
阅读(491) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~