博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解读startx(转)
阅读量:2451 次
发布时间:2019-05-10

本文共 4920 字,大约阅读时间需要 16 分钟。

解读startx(转)[@more@]

总览:

startx 只是xinit的一个前端工具,它所做的只是设置好一些变量,资源。然后再用xinit 启动X window.

xinit的命令格式:

xinit [ [client] clientargs] [-- [server] [display] serverargs]

startx所做的工作:

一.获取命令行参数

1.client段

clientargs:

完全从命令行中获取,无默认值

client:

如果没有指定,但是已经指定clientargs,则使用/usr/X11R6/bin/xterm

如果没有指定,且没有指定clientargs,则使用./defaultclientargs,即按以下顺序取值:

$HOME/.xinitrc -> /usr/X11R6/lib/X11/xinit/xinitrc

/usr/X11R6/lib/X11/xinit/xinitrc其实就是执行/etc/X11/Xsessions这个脚本

而/etc/X11/Xsession又会检查$HOME/.xsession,如果存在则把它作为client.

所以如果$HOME/.xinitrc不存在时,它可以使用$HOME/.xsession;而当$HOME/.xinitrc存在

时,它并不会使用$HOME/.xsession

2.server段

跟client类似

增加一个display的设置,默认为":0"

二.设置标志认证

三.通过xinit启动X

四.关闭X时,进行一些收尾工作。

对xinit来说,如果没有指定client,则使用$HOME/.xinitrc,如果这个也不存在则使用xterm;如果没有指定server,则使用$HOME/.xserverc,如果这这个不存在的话则使用X :0。

所以当由startx启动X时

client的顺序是: 命令行 -> $HOME/.xinitrc -> $HOME/.xsession -> /usr/X11R6/lib/X11/xinit/xinitrc

server的顺序是: 命令行 -> $HOME/.xserverrc -> /usr/X11R6/lib/X11/xinit/xserverrc

以上"->"表示:当前一个不存在时,则取下面一个,直到存在。

源码:

#!/bin/sh

# $Xorg: startx.cpp,v 1.3 2000/08/17 19:54:29 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.

#

# $XFree86: xc/programs/xinit/startx.cpp,v 3.12.2.2 2002/01/28 18:27:34 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/X11R6/lib/X11/xinit/xinitrc

sysserverrc=/usr/X11R6/lib/X11/xinit/xserverrc

defaultclient=/usr/X11R6/bin/xterm

defaultserver=/usr/X11R6/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"$1" != x ]; do

case "$1" in

# '' required to prevent cpp from treating "/*" as a C comment.

/''*|./''*)

#这个参数是以"/"或者"./"开头

if [ "$whoseargs" = "client" ]; then

if [ x"$clientargs" = x ]; then

# 如果clientargs为空,说明这个参数是从命令行传入的第一个参数

# 故它应该是client

client="$1"

else

clientargs="$clientargs $1"

fi

else

if [ x"$serverargs" = x ]; then

#为什么这里不用display是否为空来判断呢?

#因为display可以省略,这时则不能正确判断了。

server="$1"

else

serverargs="$serverargs $1"

fi

fi

;;

--)

whoseargs="server"

;;

*)

if [ "$whoseargs" = "client" ]; then

clientargs="$clientargs $1"

else

# display must be the FIRST server argument

if [ x"$serverargs" = x ] && expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then

#如果serverargs为空,并且$1是以":"跟数字组成,即为display参数。

display="$1"

else

serverargs="$serverargs $1"

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 2>&1; then

if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then

hostname=`hostname -f`

#long hostname

fi

fi

if [ -z "$hostname" ]; then

hostname=`hostname`

fi

#以上是设置hostname

#添加X标记认证。

authdisplay=${display:-:0}

#设置要验证的显示,如果display已经设置则取display的值;

#如果display没有设置,则取:0

mcookie=`mcookie`

for displayname in $authdisplay $hostname$authdisplay; do

if ! xauth list "$displayname" | grep "$displayname " >/dev/null 2>&1; 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 2>&1; then

deallocvt

fi

由于本人对X机制也不是很了解,所以错误在所难免,欢迎大家指正。

有关xauth部分,请参阅:http://thunder.prohosting.com/~bric...1/Xsafe.htm#5.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-938299/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-938299/

你可能感兴趣的文章
SQL Server 2019中的轻量级性能分析
查看>>
学习MySQL:使用SELECT语句从MySQL服务器查询数据
查看>>
sql聚簇索引和非聚簇索引_使用SQL CREATE INDEX创建聚簇和非聚簇索引
查看>>
如何在SQL Server中索引外键列
查看>>
mysql 如何对表排序_学习MySQL:对表中的数据进行排序和过滤
查看>>
sql azure 语法_将SQL工作负载迁移到Microsoft Azure:规划迁移
查看>>
5000_500
查看>>
同步等待 异步等待_异步等待
查看>>
designmode_designMode
查看>>
api代理提取_提取API
查看>>
php 锚点_使用PHP分配锚点ID
查看>>
css 相同的css属性_CSS属性,内容和L10N
查看>>
v视差 u视差_视差SEO难题
查看>>
pygments_在PHP和WordPress上的Pygments
查看>>
js .has_使用has.js进行JavaScript功能检测
查看>>
javascript 编码_带类JavaScript编码
查看>>
dojo ajax 传参_使用Dojo动画AJAX记录删除
查看>>
unity 施加力量_在空块元素上施加宽度
查看>>
内核标头和开发包_PHP标头和流行的Mime类型
查看>>
preferreds-color-scheme:CSS媒体查询
查看>>