探究Xwindow System原理与启动过程.docx

上传人:b****5 文档编号:6077281 上传时间:2023-01-03 格式:DOCX 页数:12 大小:25.84KB
下载 相关 举报
探究Xwindow System原理与启动过程.docx_第1页
第1页 / 共12页
探究Xwindow System原理与启动过程.docx_第2页
第2页 / 共12页
探究Xwindow System原理与启动过程.docx_第3页
第3页 / 共12页
探究Xwindow System原理与启动过程.docx_第4页
第4页 / 共12页
探究Xwindow System原理与启动过程.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

探究Xwindow System原理与启动过程.docx

《探究Xwindow System原理与启动过程.docx》由会员分享,可在线阅读,更多相关《探究Xwindow System原理与启动过程.docx(12页珍藏版)》请在冰豆网上搜索。

探究Xwindow System原理与启动过程.docx

探究XwindowSystem原理与启动过程

探究XwindowSystem原理与启动过程

一)基本运行原理

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]*

由上面代码可以得出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。

别的情况类推。

至于xinit,则根据startx传过来的参数启动Xserver,成功后根据xinitrc启动Xclient。

以上即为XWindowSystem的启动过程,startx只是负责一些参数传递,真正的X启动由xinit实现。

实际上可以分为启动Xserver和启动Xclient两部分。

下面在用户目录下构造.xinitrc(即Xclient)和.xserverrc(即Xserver)文件。

在.xserverrc里写入/usr/bin/X11/X:

1。

.xinitrc里写入/usr/bin/X11/xeyes-displaylocalhost:

1。

这就是最简单的Xserver+Xclient了,只不过把屏幕编号从默认的0改为了1,这里Xserver即是/usr/bin/X11/X程序,Xclient即是/usr/bin/X11/xeyes程序。

总结下单机用startx启动过程吧:

(1)startx置Xclient和Xserver的位置,处理参数并调用xinit

(2)xinit根据传过来的参数启动Xserver,成功后呼叫Xclient

(3)根据xinitrc设置相关资源,启动窗口管理器,输入法和其他应用程序等Xclient程序。

但还未搞清楚gnome是怎么起来的!

gnome当然属于Xclient了,看上面启动过程第(3)步。

这里分两种情况看吧,第一种是用系统的xinitrc文件。

看/etc/X11/xinit/xinitrc文件(我的sarge装x-window-system-core和gnome-core),里面只包含了./etc/X11/Xsession一句话。

接着看/etc/X11/Xsession这个脚本,只看关键部分吧。

最后面有:

SESSIONFILES=$(run_parts$SYSSESSIONDIR)

if[-n"$SESSIONFILES"];then

forSESSIONFILEin$SESSIONFILES;do

.$SESSIONFILE

done

fi

exit0

接着看run_parts(),位于本文件中间:

run_parts(){

#untilrun-parts--noexecisimplemented

if[-z""];then

internal_errormsg"run_parts()calledwithoutanargument."

fi

if[!

-d""];then

internal_errormsg"run_parts()called,but""doesnotexistoris"

"notadirectory."

fi

forFin$(ls);do

ifexpr"$F":

'[[:

alnum:

]_-]+

大概意思就是run_parts()把$SYSSESSIONDIR目录下的文件名取出来赋值给$SESSIONFILES,然后循环运行该目录下的文件。

看看该目录,即/etc/X11/Xsession.d目录,可以看到几个以数字开头的文件,实际上这些数值就表示了这几个文件被运行的优先级,数字小的优先级高,因为在上面的run_parts()里是用ls命令显示该目录下的文件,所以前面数字小的被ls时显示在前面,所以被:

forSESSIONFILEin$SESSIONFILES;do

.$SESSIONFILE

done

这个for循环执行时也先被执行。

看到/etc/X11/Xsession.d目录下有个55gnome-session_gnomerc文件,里面提到了STARTUP变量。

然后运行:

xdkui@Debian:

/etc/X11/Xsession.d$grepSTARTUP*

看到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

即设置启动程序,实际上设置STARTUP变量,如果以上程序都没有找到,则会报错退出,即X环境没有被启动。

再运行

xdkui@Debian:

/etc/X11/Xsession.d$grepSTARTUP*

看到优先级最低也即最后被运行的99xfree86-common_start文件,里面只有一句话:

exec$STARTUP

好了,到这里就启动我们的Xclient了,终于完了^_^。

总结下这第一种方式的启动过程,简单的说就是依次顺序查找/usr/bin/x-session-manager,x-window-manager,/usr/bin/x-terminal-emulator这三个文件。

如果存在则启动之,也即Xclient。

如果三个都不存在则报错退出了。

看/usr/bin/x-session-manager文件可以看到是个符号连接,最终连接到/usr/bin/gnome-session,也就是gnome了。

至于我们在gnome启动时可能会设置启动输入法等程序,那就归gnome-session管了,也就不再分析了。

可以试着把/usr/bin/x-session-manager改为指向xfce4-session(如果安装了的话),再startx就会启动xfce4环境了。

大概RedHat的switchdesk工具就是改这个连接实现的吧?

或者删掉/usr/bin/x-session-manager,再startx,只启动了/usr/bin/x-window-manager所指向的windowmanager了吧,我这里是blackbox。

下面看第二种情况,即用户目录的xinitrc文件$HOME/.xinitrc。

对比hiweed-debian-desktop_0.55_i386,存在$HOME/.xinitrc文件,在里面有execxfce4-session。

故其Xclient可以说最主要的x-session-manger是从$HOME/.xinitrc启动的。

也就不会经过上面第一种情况的执行过程了。

终于把gnome(或者说x-session-manger)的启动过程弄明白了,下面说点别的吧。

xinit程序同时启动Xserver和Xclient,这在单机上还可。

要是位于网络上的两台电脑分别是client和server,则xinit就无能为力了。

这时就得靠纯“手工”来启动X了。

下面简单的“手工”启动Xserver和Xclient:

在CUI模式下运行命令:

xdkui@Debian:

~$X:

1&

看到了一个灰色的全屏幕和一个鼠标指针,这就是Xserver了,其屏幕编号为1。

下面构造Xclient,按Ctrl+Alt+F1回到刚才的CUI(Ctrl+Alt+F7对应本机的第一个启动的Xserver,Ctrl+Alt+F8对应第二个,有人说F7对应屏幕编号为0的Xserver实际上是不对的,如果第一个启动的屏幕编号为1,第二个启动的编号为0,则F7对应1屏幕,F8对应0屏幕),运行命令:

xdkui@Debian:

~$xeyes-displaylocalhost:

1&

然后按Ctrl+Alt+F7,看到我们的Xclient也就是xeyes了吧。

再回到CUI,运行

xdkui@Debian:

~$X&

开启一个屏幕编号0的Xserver,CUI下再运行

xdkui@Debian:

~$xterm&

这时Ctrl+Alt+F7对应屏幕编号1;而F8对应屏幕编号0,且其Xclient为xterm。

先退出上面的两个Xserver,下面复杂点手动启动我们的gnome吧,首先:

xdkui@Debian:

~$X&

然后:

xdkui@Debian:

~$gnome-session

看到的就和用startx启动的X一样了,这时Xserver是X这个程序,Xclient是gnome-session及其启动的窗口管理器等程序。

看到这里感觉xinit用处并不大(?

?

不知是否正确),简单的脚本就可以实现。

本来想把xinit反汇编了分析下,可懒得搞了^_^这是位于本机的情况,对于Xserver和Xclient位于不同主机的情况见下面本文第三部分。

个人感觉对于XWindowSystem,搞清楚Xserver与Xclient关系很重要。

一般Xserver很简单,就是/usr/bin/X11/X程序;Xclient则花样繁多,从高级的CDE,GNOME,KDE,到低级一点的只有twm,WindowMaker,blackbox等窗口管理器,再到最简陋的只有xterm,rxvt,xeyes等单个x程序。

正是由于Xclient的各种搭配,使得我们的XWindowSystem看起来多样化。

这可能也是XWindowSystem最大的卖点之一吧^_^

三)跨网络运行XWindowSystem

一般用来做服务器的系统(Linux,FreeBSD,Solaris等等)都不会装Xserver,甚至很多都没有显示器。

这样可以在这些系统里安装简单的Xclient,以GUI的方式远程显示在管理员们所坐的Xserver里。

我们实验室用FreeBSD做网关,提供WWW,FTP服务,一般在管理员的本地机器起个Xserver,然后ssh或telnet上网关运行Xclient程序显示在本地显示器上,当然,也可用XDMCP(XDisplayManagerControlProtocol),manxsession里提到/etc/X11/Xsession一般被startx(我的/etc/X11/xinit/xinitrc里调用Xsession脚本)或displaymanager调用,但有的displaymanager只调用Xsession而不是xinitrc,故为了startx和displaymanager两种方式下都可正常启动GUI,最好把Xclient启动的程序放在Xsession文件里。

远程运行Xclient程序需要设置DISPLAY环境变量,设置为主机名称:

屏幕编号(如192.168.1.2:

0,则表示Xserver是192.168.1.2这台机器上的0号屏幕);或是给Xclient程序加个—display参数。

由于条件限制,只测试了位于TCP/IP网络环境,Xserver为192.168.1.2,Xclient为192.168.1.1。

1)Windows系统做Xserver

a)用ssh或telnet方式

Windows下面的Xserver软件有很多种,我这里使用X-win32。

在Windows里运行X-win32程序,则相当于本地机器是个Xserver。

远程登录上Debian(我这里是用VMware仿真网络环境,直接进虚拟机即可^_^),运行:

xdkui@xclient:

~$exportDISPLAY=192.168.1.2:

0

xdkui@xclient:

~$xterm&

这时即在Windows里的Xserver里看到了xterm了,至于Xclient还运行什么程序就看你的需要了,文件管理器阿,资源查看器等。

当然,这里X-win32要设置好授权,好像默认是禁止接入控制,即任何Xclient都可使用这个Xserver。

b)XDMCP方式

常见的DisplayManager有xdm,gdm,kdm等。

我这里使用的是gdm。

需要修改gdm的配置文件/etc/X11/gdm/gdm.conf,修改[xdmcp]段的Enable=true,使得可以远程登录,在Xclient运行gdm。

在X-win32里建一个XDMCP的session,查询方式,填入IP为运行gdm的机器地址。

连接,即可看到登录界面,下面的就不用说了,享受吧

2)Linux与Linux互联

a)ssh或telnet方式

在linux本地起个Xserver,需要注意授权问题,建立文件/etc/X0.hosts,填入Xclient的IP192.168.1.1,其中X0.hosts表示本地第0个屏幕允许连接的Xclient地址,建立X1.hosts文件则是本地第1个屏幕允许连接的Xclient地址,以此类推,manxserver里有。

运行

xdkui@xserver:

~$X&

运行该程序时别加-nolisten参数,否则不会在网络上侦听。

这个时候Ctrl+Alt+F7是Xserver,返回Ctrl+Alt+F1还可以ssh上Xclient机器上。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1