欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

startx啟動(dòng)過(guò)程分析

系統(tǒng) 2361 0

From:? http://blog.csdn.net/hustwarhd/article/details/3069066

startx 啟動(dòng)過(guò)程分析

?

?

JiananHe

09/19/2008

?

目錄

1 ????? xinit

1.1 ?????? 功能

1.2 ?????? 用法

1.3 ?????? 例子

1.4 ?????? 分析

2 ????? startx 腳本

2.1 ?????? 功能

2.2 ?????? 用法

2.3 ?????? 例子

2.4 ?????? 分析

2.5 ?????? 總結(jié)

3 ????? startx 默認(rèn)啟動(dòng)過(guò)程

3.1 ?????? startx 的幾種啟動(dòng)方式

3.2 ?????? Xsession

4 ????? startx 啟動(dòng)過(guò)程小結(jié)

?

1 ??????? xinit

在說(shuō)明 startx 之前,我想我們應(yīng)該先了解一下 xinit 。因?yàn)? startx 就是通過(guò)調(diào)用 xinit 啟動(dòng)X的。

1.1 ???? 功能

當(dāng)我們安裝了 Ubuntu 后,默認(rèn)就已經(jīng)安裝了 xinit ,它位于 /usr/bin 下。 xinit 是一個(gè)二進(jìn)制文件,并非是一個(gè)腳本。它的主要功能是啟動(dòng)一個(gè) X 服務(wù)器,同時(shí)啟動(dòng)一個(gè)基于 X 的應(yīng)用程序。

1.2 ???? 用法

xinit 的用法為: xinit [[client] options ] [-- [server] [display] options] 。其中 client 用于指定一個(gè)基于 X 的應(yīng)用程序, client 后面的 options 是傳給這個(gè)應(yīng)用程序的參數(shù), server 是用于指定啟動(dòng)哪個(gè) X 服務(wù)器,一般為 /usr/bin/X /usr/bin/Xorg display 用于指定 display number ,一般為0,表示第一個(gè) display , option 為傳給 server 的參數(shù)。

?

如果不指定 client , xinit 會(huì)查找 HOME (環(huán)境變量)目錄下的 .xinitrc 文件,如果存在這個(gè)文件, xinit 直接調(diào)用 execvp 函數(shù)執(zhí)行該文件。如果這個(gè)文件不存在,那么 client 及其 options 為: ?xterm -geometry +1+1 -n login -display :0? 。

?

如果不指定 server xinit 會(huì)查找HOME(環(huán)境變量)目錄下的 .xserverrc 文件,如果存在這個(gè)文件, xinit 直接調(diào)用execvp函數(shù)執(zhí)行該文件。如果這個(gè)文件不存在,那么 server 及其display為:?X :0。如果系統(tǒng)目錄中不存在X命令,那么我們需要在系統(tǒng)目錄下建立一個(gè)名為X的鏈接,使其指向真正的X? server 命令(Ubuntu下為Xorg)。

?

1.3 ???? 例子

下面是幾個(gè)關(guān)于 xinit 應(yīng)用的例子:

1) ?????? xinit /usr/bin/xclock -- /usr/bin/X :0

該例子將啟動(dòng)X? server ,?同時(shí)將會(huì)啟動(dòng)xclock。請(qǐng)注意指定client或 server 時(shí),需要用絕對(duì)路徑,否則 xinit 將因無(wú)法區(qū)別是傳給xterm或 server 的參數(shù)還是指定的client或 server 而直接當(dāng)成是參數(shù)處理。

2) ?????? HOME 下新建 .xinitrc 文件,并加入以下幾行:

    
      
        ???????? xsetroot -solid gray &
      
    
  
    
      
        ???????? xclock -g 50x50-0+0 -bw 0 &
      
    
  
    
      
        ???????? xterm -g 80x24+0+0 &
      
    
  
    
      
        ???????? xterm -g 80x24+0-0 &
      
    
  
    
      
        ???????? twm
      
    
  

當(dāng) xinit 啟動(dòng)時(shí),它會(huì)先啟動(dòng)X? server ,然后啟動(dòng)一個(gè)clock,兩個(gè)xterm,最后啟動(dòng)窗口管理器twm。

請(qǐng)注意:

最后一個(gè)命令不能后臺(tái)運(yùn)行,否則所有命令都后臺(tái)運(yùn)行的話xinit就會(huì)返回退出,同樣的,除最后一個(gè)命令外都必須后臺(tái)運(yùn)行,否則后面的命令將只有在該命令退出后才能運(yùn)行。

?

1.4 ???? 分析

看到這里,眼尖的人或許早以看出xinit的功能完全可以由腳本來(lái)實(shí)現(xiàn),例如要啟動(dòng)X? Server ?和一個(gè)xterm,就像xinit默認(rèn)啟動(dòng)的那樣,只需要在新建一個(gè)腳本或在rc.local中加入:

X&

export DISPLAY=:0.0

xterm

這個(gè)實(shí)現(xiàn)完全正確,然而卻并沒(méi)有完全實(shí)現(xiàn) xinit 所具有的功能, xinit 所有的一項(xiàng)功能就是當(dāng)最后一個(gè)啟動(dòng)的client(如上面第二個(gè)例子中的twm窗口管理器)退出后,X服務(wù)器也會(huì)退出。而我們的腳本實(shí)現(xiàn)中當(dāng)我們退出xterm后并不會(huì)退出X? server

?

?

2 ??????? startx 腳本

用過(guò)linux的人基本上都知道linux下有個(gè)命令叫做startx,那么它到底是怎么實(shí)現(xiàn)的呢?

2.1 ???? 功能

當(dāng)我們?cè)诮K端下想啟動(dòng)圖形界面時(shí),我們都會(huì)通過(guò)輸入startx來(lái)實(shí)現(xiàn),該命令可以啟動(dòng)一個(gè)X server ,而且可以啟動(dòng)一個(gè)漂亮的圖形界面(Ubuntu下,我裝的是gnome)。

2.2 ???? 用法

Startx的用法和 xinit 的基本一樣: startx ?[ [? client ?]? options ?... ] [? -- ?[? server ?]? options ?... ]。為什么呢?這是因?yàn)閟tartx其實(shí)就是一個(gè)腳本,它啟動(dòng)X? server 就是通過(guò)調(diào)用 xinit 命令實(shí)現(xiàn)的,startx的參數(shù)將全部傳給 xinit 。因此,這些參數(shù)的意義和 xinit 的參數(shù)是一樣的。

2.3 ???? 例子

下面是兩個(gè)關(guān)于startx命令的簡(jiǎn)單例子:

1) ?? startx -- -depth 16

該例子主要是以16位色啟動(dòng)X?服務(wù)器。

2) ?? startx -- -dpi 100

該例子主要是以100的dpi啟動(dòng)X?服務(wù)器。

2.4 ???? 分析

下面我們來(lái)分析一下startx腳本。startx腳本位于/usr/bin下,直接用vim打開(kāi)我們可以看到它的具體實(shí)現(xiàn)如下:

?

#!/bin/bash?# 注意:該腳本用的是 bash shell 解析的

?

# $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.16tsi Exp $

?

#下面主要是對(duì)一些變量進(jìn)行賦值。

userclientrc=$HOME/.xinitrc

sysclientrc=/etc/X11/xinit/xinitrc

?

?

userserverrc=$HOME/.xserverrc

sysserverrc=/etc/X11/xinit/xserverrc

defaultclient=xterm

defaultserver=/usr/bin/X

defaultclientargs=""

defaultserverargs=""

clientargs=""

serverargs=""

?

#下面的語(yǔ)句主要是說(shuō):如果$HOME/.xinitrc文件存在,并且不是一個(gè)目錄,那么就將defaultclientargs賦值為$HOME/.xinitrc,否則,如果/etc/X11/xinit/xinitrc存在并且不是一個(gè)目錄,就將defaultclientargs賦值為/etc/X11/xinit/xinitrc。

?

if [ -f $userclientrc ]; then

????defaultclientargs=$userclientrc

elif [ -f $sysclientrc ]; then

????defaultclientargs=$sysclientrc

?

?

?

?

?

?

fi

?

#下面的語(yǔ)句主要是說(shuō):如果$HOME/.xserverrc文件存在,并且不是一個(gè)目錄,那么就將defaultclientargs賦值為$HOME/.xserverrc,否則,如果/etc/X11/xinit/xserverrc存在并且不是一個(gè)目錄,就將defaultclientargs賦值為/etc/X11/xinit/xserverrc。

?

if [ -f $userserverrc ]; then

????defaultserverargs=$userserverrc

elif [ -f $sysserverrc ]; then

????defaultserverargs=$sysserverrc

fi

#將whoseargs變量賦值為字符串“client”,表示當(dāng)前解析的指定client的參數(shù)。

whoseargs="client"

#當(dāng)startx的一個(gè)參數(shù)不為空時(shí)就進(jìn)入while循環(huán)。

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

??client="$1" #解析出了用戶指定的Client程序

?????else

??clientargs="$clientargs $1"??#解析出了Client的參數(shù)

?????fi

?else

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

??server="$1"??#解析出了用戶指定的X Server程序

?????else

??serverargs="$serverargs $1" #解析出了X Server的參數(shù)

?????fi

?fi

?;;

????--)????#遇到“- -”就解析server

?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

??display="$1" #解析出display

?????else

??serverargs="$serverargs $1"

?????fi

?fi

?;;

????esac?????#case語(yǔ)句結(jié)束

shift??#將參數(shù)列表左移一位,即解析下個(gè)參數(shù).

done

?

# process client arguments

if [ x"$client" = x ]; then #如果client變量為空,即用戶沒(méi)有指定client。

????# if no client arguments either, use rc file instead

????if [ x"$clientargs" = x ]; then #如果用戶沒(méi)有指定client參數(shù)?就將client設(shè)為前面設(shè)定的默認(rèn)的rc文件(為$HOME/.xinitrc,或/etc/X11/xinit/xinitrc)

?client="$defaultclientargs"

????else

?client=$defaultclient #如果用戶指定了client參數(shù),就將client設(shè)定為xterm

????fi

fi

?

# process server arguments

if [ x"$server" = x ]; then #如果server變量為空,即用戶沒(méi)有指定server。

????# if no server arguments or display either, use rc file instead

????if [ x"$serverargs" = x -a x"$display" = x ]; then #如果serverargs為空,并且display為空,就將server設(shè)為前面設(shè)定的默認(rèn)的rc文件(為$HOME/. xserverrc,或/etc/X11/xinit/ xserverrc)

?server="$defaultserverargs"

????else

?server=$defaultserver?#如果用戶指定了serverargs或display,就將server設(shè)定為/usr/bin/X

????fi

fi

?

if [ x"$XAUTHORITY" = x ]; then #如果環(huán)境變量XAUTHORITY為空,就設(shè)定為$HOME/.Xauthority

????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 #如果hostname命令存在

???????if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then #如果hostname –version中不包含GNU就將hostname變量設(shè)定為命令hostname –f返回的字符串。

??hostname=`hostname -f`

???????fi

fi

?

if [ -z "$hostname" ]; then #如果hostname長(zhǎng)度為0,就將hostname變量設(shè)定為命令hostname返回的字符串。

hostname=`hostname`

fi

?

authdisplay=${display:-:0}

?

mcookie=`/usr/bin/mcookie`

?

?

?

?

?

?

?

dummy=0

?

# create a file with auth information for the server. ':0' is a dummy.

xserverauthfile=`mktemp -p /tmp serverauth.XXXXXXXXXX`

trap "rm -f $xserverauthfile" HUP INT QUIT ILL TRAP KILL BUS TERM

xauth -q -f $xserverauthfile << EOF

add :$dummy . $mcookie

EOF

serverargs=${serverargs}" -auth "${xserverauthfile}

?

# now add the same credentials to the client authority file

# if '$displayname' already exists do not overwrite it as another

# server man need it. Add them to the '$xserverauthfile' instead.

for displayname in $authdisplay $hostname$authdisplay; do

?????authcookie=`xauth list "$displayname" /

???????| sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null;

????if [ "z${authcookie}" = "z" ] ; then

????????xauth -q << EOF

add $displayname . $mcookie

EOF

?removelist="$displayname $removelist"

????else

????????dummy=$(($dummy+1));

????????xauth -q -f $xserverauthfile << EOF

add :$dummy . $authcookie

EOF

????fi

done

echo "client=$client,clientargs=$clientargs,server= $server, display= $display, serverargs=$serverargs"

?

# 下面的語(yǔ)句通過(guò)xinit 啟動(dòng)X server 和Clients

xinit $client $clientargs -- $server $display $serverargs

?

?

if [ x"$removelist" != x ]; then

????xauth remove $removelist

fi

if [ x"$xserverauthfile" != x ]; then

????rm -f $xserverauthfile

fi

?

?

?

?

?

if command -v deallocvt > /dev/null 2>&1; then

????deallocvt??#釋放所有未使用的虛擬終端的核心內(nèi)存和數(shù)據(jù)結(jié)構(gòu)

fi

?

?

2.5 ???? 總結(jié)

由以上對(duì) startx 腳本的分析,我們可以知道: startx 將會(huì)先解析用戶的參數(shù),如果該用戶指定了該參數(shù)(即解析結(jié)果不為空),那么 startx 就會(huì)以該參數(shù)來(lái)啟動(dòng) xinit ,否則就會(huì)解析(與其說(shuō)是解析,還不如說(shuō)是執(zhí)行) $HOME 目錄下的 rc 文件,如果該文件不存在,就會(huì)解析系統(tǒng)目錄下( /etc/X11/xinit/ )的 rc 文件,如果這個(gè)文件也不存在,那 startx 就將以默認(rèn)的 client xterm )和 server /usr/bin/X )為參數(shù)來(lái)啟動(dòng) xinit

?

?

3 ??????? startx 默認(rèn)啟動(dòng)過(guò)程

通過(guò)以上對(duì) startx 腳本的分析,我們知道了 startx 的基本的啟動(dòng)流程,但是到目前為止,我們還不知道僅僅在終端輸入 startx 是怎么樣啟動(dòng) gnome 那漂亮的桌面的,下面我們來(lái)看一下其啟動(dòng)過(guò)程。

3.1 ???? startx 的幾種啟動(dòng)方式

由對(duì)startx腳本的分析,我們可以知道 startx 主要有三種啟動(dòng)方式:

a)、一種是自己指定要啟動(dòng)的 client server ,?例如: startx /usr/bin/xclock -- /usr/bin/X :0 ;

b)、一種是通過(guò)在 $HOME 下新建 .xinitrc 文件來(lái)指定要啟動(dòng)的多個(gè) client .xserverrc 來(lái)指定要啟動(dòng)的 server (注意:這兩個(gè)文件本來(lái)是不存在的);

c)、還有一種是直接輸入 startx 而不指定參數(shù),這也就是我們啟動(dòng) gnome 桌面的方法。這里

?

我們主要介紹最后一種啟動(dòng)方法。

?

在c這種啟動(dòng)方法中,我們可以知道, startx 腳本會(huì)先去看系統(tǒng)目錄( /etc/X11/xinit/ )下的 rc 文件是否存在,如果不存在就會(huì)用默認(rèn)的 xterm /usr/bin/X 來(lái)啟動(dòng) xinit 。顯然, startx 啟動(dòng)的不是 xterm ,而是 gnome 桌面,因此 gnome 的啟動(dòng)是通過(guò)系統(tǒng)文件 /etc/X11/xinit/xinitrc 來(lái)指定的。

?

/etc/X11/xinit/xinitrc 文件的內(nèi)容如下所示:

?

#!/bin/bash??# 注意 該腳本用的是bash shell 解析的

?

# $Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $

?

# /etc/X11/xinit/xinitrc

#

# global xinitrc file, used by all X sessions started by xinit (startx)

?

# invoke global X session script

. /etc/X11/Xsession??#在當(dāng)前這個(gè)shell環(huán)境中執(zhí)行Xsession腳本

?

?

因此, gnome 的啟動(dòng)應(yīng)該在Xsession里。

?

而X Server的啟動(dòng)則是通過(guò)系統(tǒng)文件 /etc/X11/xinit/xserverrc 來(lái)指定的,這個(gè)文件的內(nèi)容為:

?

#!/bin/sh # 注意:該腳本用的是 Bourne shell 解析的

?

# $Id: xserverrc 189 2005-06-11 00:04:27Z branden $

?

exec /usr/bin/X11/X -nolisten tcp

?

3.2 ?????? Xsession

下面是Xsession腳本的內(nèi)容:

#!/bin/sh # 注意:該腳本用的是 Bourne shell 解析的

#

# /etc/X11/Xsession

#

# global Xsession file -- used by display managers and xinit (startx)

?

# $Id: Xsession 967 2005-12-27 07:20:55Z dnusinow $

?

set –e #打開(kāi)errexit選項(xiàng),該選項(xiàng)表示:如果下面有命令返回的狀態(tài)非0,則退出程序。

?

PROGNAME=Xsession

?

#下面四個(gè)是信息輸出函數(shù),可以不管

message () {

??# pretty-print messages of arbitrary length; use xmessage if it

??# is available and $DISPLAY is set

??MESSAGE="$PROGNAME: $*"

??echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2

??if [ -n "$DISPLAY" ] && which xmessage > /dev/null 2>&1; then

????echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} | xmessage -center -file -

??fi

}

?

message_nonl () {

??# pretty-print messages of arbitrary length (no trailing newline); use

??# xmessage if it is available and $DISPLAY is set

??MESSAGE="$PROGNAME: $*"

??echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2;

??if [ -n "$DISPLAY" ] && which xmessage > /dev/null 2>&1; then

????echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} | xmessage -center -file -

??fi

}

?

errormsg () {

??# exit script with error

??message "$*"

??exit 1

}

?

internal_errormsg () {

??# exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message

# One big call to message() for the sake of xmessage; if we had two then

??# the user would have dismissed the error we want reported before seeing the

??# request to report it.

??errormsg "$*" /

???????????"Please report the installed version of the /"x11-common/"" /

???????????"package and the complete text of this error message to" /

???????????"<debian-x@lists.debian.org>."

}

?

# initialize variables for use by all session scripts

?

OPTIONFILE=/etc/X11/Xsession.options

?

SYSRESOURCES=/etc/X11/Xresources

USRRESOURCES=$HOME/.Xresources

?

SYSSESSIONDIR=/etc/X11/Xsession.d

USERXSESSION=$HOME/.xsession

USERXSESSIONRC=$HOME/.xsessionrc

ALTUSERXSESSION=$HOME/.Xsession

ERRFILE=$HOME/.xsession-errors

?

# attempt to create an error file; abort if we cannot

if (umask 077 && touch "$ERRFILE") 2> /dev/null && [ -w "$ERRFILE" ] &&

??[ ! -L "$ERRFILE" ]; then

??chmod 600 "$ERRFILE"

elif ERRFILE=$(tempfile 2> /dev/null); then

??if ! ln -sf "$ERRFILE" "${TMPDIR:=/tmp}/xsession-$USER"; then

????message "warning: unable to symlink /"$TMPDIR/xsession-$USER/" to" /

?????????????"/"$ERRFILE/"; look for session log/errors in" /

?????????????"/"$TMPDIR/xsession-$USER/"."

??fi

else

??errormsg "unable to create X session log/error file; aborting."

fi

# truncate ERRFILE if it is too big to avoid disk usage DoS

if [ "`stat -c%s /"$ERRFILE/"`" -gt 500000 ]; then

??T=`mktemp -p "$HOME"`

??tail -c 500000 "$ERRFILE" > "$T" && mv -f "$T" "$ERRFILE" || rm -f "$T"

fi

?

exec >>"$ERRFILE" 2>&1

echo "$PROGNAME: X session started for $LOGNAME at $(date)"

?

# sanity check; is our session script directory present?

?

#如果/etc/X11/Xsession.d不存在或不是一個(gè)目錄則打印錯(cuò)誤信息并退出。

if [ ! -d "$SYSSESSIONDIR" ]; then

??errormsg "no /"$SYSSESSIONDIR/" directory found; aborting."

fi

# Attempt to create a file of non-zero length in /tmp; a full filesystem can

# cause mysterious X session failures.??We do not use touch, :, or test -w

# because they won't actually create a file with contents.??We also let standard

# error from tempfile and echo go to the error file to aid the user in

# determining what went wrong.

WRITE_TEST=$(tempfile)

if ! echo "*" >>"$WRITE_TEST"; then

??message "warning: unable to write to ${WRITE_TEST%/*}; X session may exit" /

??????????"with an error"

fi

rm -f "$WRITE_TEST"

# use run-parts to source every file in the session directory; we source

# instead of executing so that the variables and functions defined above

# are available to the scripts, and so that they can pass variables to each

# other

?

#將/etc/X11/Xsession.d目錄中的所有文件都讀出,并存入SESSIONFILES變量中。

SESSIONFILES=$(run-parts --list $SYSSESSIONDIR)

#如果SESSIONFILES變量中的字符串不為空,即/etc/X11/Xsession.d中有文件存在

if [ -n "$SESSIONFILES" ]; then

??set +e #關(guān)閉errexit選項(xiàng)

??for SESSIONFILE in $SESSIONFILES; do

????. $SESSIONFILE #在當(dāng)前shell環(huán)境下執(zhí)行該文件

??done

??set –e #打卡errexit選項(xiàng)

fi

exit 0

?

從以上的對(duì)Xsession腳本文件的分析,可以看出,Xsession腳本僅僅是執(zhí)行了/etc/X11/Xsession.d目錄下的所有文件,在該目錄下,文件包括:

20x11-common_process-args

30x11-common_xresources

40x11-common_xsessionrc

50x11-common_determine-startup

55gnome-session_gnomerc

60seahorse

60xdg-user-dirs-update

80im-switch

90-console-kit

90x11-common_ssh-agent

99x11-common_start

?

每個(gè)文件名都以數(shù)字開(kāi)頭,這主要是為了確保這些腳本的執(zhí)行順序,run-parts會(huì)將數(shù)字小的排在前面,這樣就能確保以上文件能按數(shù)字由小到大的順序執(zhí)行。

?

1、20x11-common_process-args

????這個(gè)文件主要是處理傳給/etc/X11/xinit/ xinitrc腳本文件的參數(shù)的。該參數(shù)個(gè)數(shù)只能為0或一個(gè),否則將不進(jìn)行任何處理。如果該參數(shù)是failsafe,則該腳本將執(zhí)行x-terminal-emulator,否則就執(zhí)行該參數(shù)。需要說(shuō)明的是,x-terminal-emulator是一個(gè)符號(hào)鏈接,指向/etc/alternatives/x-terminal-emulator,同時(shí),/etc/alternatives/x-terminal-emulator也是一個(gè)符號(hào)鏈接,它指向/usr/bin/gnome-terminal.wrapper,而gnome-terminal.wrapper則是一個(gè)perl腳本,它最終是調(diào)用了gnome-terminal。

?

2、30x11-common_xresources

????該文件主要是調(diào)用xrdb來(lái)將/etc/X11/Xresources目錄下及$HOME/.Xresources目錄下的文件的內(nèi)容來(lái)設(shè)置根窗口的 屏幕?0?上的 RESOURCE_MANAGER 屬性的內(nèi)容。

?

3、40x11-common_xsessionrc

????該文件主要是判斷$HOME/.xsessionrc文件是否存在,如果存在則執(zhí)行該腳本文件。

?

4、50x11-common_determine-startup

????該文件主要先查看配置文件/etc/X11/Xsession.options中是否允許使用用戶的xsession,如果/etc/X11/Xsession.options中存在allow-user-xsession字段,則查看$HOME/.xsession是否存在并有執(zhí)行權(quán)限,如果是,則將STARTUP變量設(shè)置為該文件,如果沒(méi)有執(zhí)行權(quán)限就將STARTUP變量設(shè)置為“sh?該xsession文件”。如果此時(shí)STARTUP變量仍然為空,則將其設(shè)置為x-session-manager,x-window-manager或x-terminal-emulator。注意:這個(gè)STARTUP將會(huì)在后面的腳本中被啟動(dòng)。

?

5、55gnome-session_gnomerc

???該文件會(huì)先得到STARTUP的basename,如:STARTUP=/usr/bin/x-session-manager,則其basename為x-session-manager。再判斷該basename?是否為gnome-session,或者為x-session-manager并且x-session-manager是個(gè)符號(hào)鏈接,它指向/usr/bin/gnome-session,如果是則執(zhí)行$HOME/.gnomerc(如果該文件存在并且可讀)。

?

6、60seahorse

???將STARTUP重新賦值為“/usr/bin/seahorse-agent $STARTUP”,這個(gè)可能只是為安全考慮才這么做的,具體的我也不是很清楚,只是看了一下seahorse-agent的幫助,知道seahorse是一個(gè) GNOME的應(yīng)用程序,它用于為用戶的輸入進(jìn)行暫時(shí)的安全存儲(chǔ),而 seahorse-agent 則是 seahorse 的一個(gè)代理而已。

?

7、60xdg-user-dirs-update

???用xdg-user-dirs-update自動(dòng)生成$HOME下的文件夾,該命令主要是根據(jù)/etc/xdg/user-dirs.defaults文件的內(nèi)容來(lái)為用戶創(chuàng)建文件夾的。

?

8、80im-switch

???該文件主要用于設(shè)置輸入法。具體的請(qǐng)自己參考文件內(nèi)容。

?

9、90-console-kit

???如果環(huán)境變量$XDG_SESSION_COOKIE為空,并且/usr/bin/ck-launch-session可執(zhí)行,則將STARTUP重新賦值為” /usr/bin/ck-launch-session $STARTUP”。至于ck-launch-session的功能,我也不是很清楚,估計(jì)是和session有關(guān)。

?

10、90x11-common_ssh-agent

???該文件主要先查看配置文件/etc/X11/Xsession.options中是否使用ssh agent,如果/etc/X11/Xsession.options中存在use-ssh-agent字段,則判斷/usr/bin/ssh-agent是否可執(zhí)行,并且環(huán)境變量$SSH_AUTH_SOCK和$SSH2_AUTH_SOCK是否都為空,如果是,這將STARTUP重新賦值為” /usr/bin/ssh-agent $STARTUP”。

?

11、99x11-common_start

????它僅僅是用exec啟動(dòng)$STARTUP。關(guān)于exec,在Bourne shell中,它與fork的區(qū)別就在于它執(zhí)行一個(gè)新的腳本不需創(chuàng)建sub-shell,而它與Source和Dot的區(qū)別就在與在這條語(yǔ)句后面的語(yǔ)句將不會(huì)再被執(zhí)行。此時(shí),我們可以發(fā)現(xiàn)變量$STARTUP的值為:“startup=/usr/bin/ssh-agent??/usr/bin/ck-launch-session /usr/bin/seahorse-agent --execute x-session-manager”,?因此,最終將會(huì)被執(zhí)行的就是這么一條語(yǔ)句。而x-session-manager在Ubuntu8.04中僅僅是個(gè)符號(hào)鏈接,它最終指向的是gnome-session。

????gnome-session則是啟動(dòng)GNOME桌面環(huán)境的,這個(gè)程序一般被登入管理器gdm、xdm和腳本startx調(diào)用。(gnome-session如何啟動(dòng)桌面,待研究)

?

?

?

4 ??????? startx 啟動(dòng)過(guò)程小結(jié)

綜上所述, startx 的默認(rèn)啟動(dòng)過(guò)程為: startx 調(diào)用并將系統(tǒng)文件 /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc ?作為參數(shù)傳給 xinit , xinit 就會(huì)先執(zhí)行系統(tǒng)文件 /etc/X11/xinit/xserverrc 以啟動(dòng) X Server ,然后執(zhí)行 /etc/X11/xinit/xinitrc ,而xinitrc則會(huì)執(zhí)行腳本 /etc/X11/Xsession ,而 Xsession 則會(huì)按順序調(diào)用執(zhí)行 /etc/X11/Xsession.d 目錄下的文件,從而最終調(diào)用了 gnome-session 這個(gè)用于啟動(dòng) GNOME 桌面環(huán)境的程序。

startx啟動(dòng)過(guò)程分析


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 五月婷婷开心综合 | 久久经典国产视频 | 高清国产美女一级a毛片 | 日本国产网站 | 国产一区中文字幕 | 26uuu最新地址 | 亚洲国产网站 | 免费在线黄色电影 | 91最新免费观看在线 | 伊人久久大杳蕉综合大象 | av午夜电影 | 日日操夜夜操视频 | 嫩草91| 人人草视频在线 | 91看片在线看 | 国产三级在线视频 一区二区三区 | 久久精品蜜芽亚洲国产a | a黄视频 | 亚洲精品免费在线观看 | 毛片在线视频观看 | 久久伊99综合婷婷久久伊 | 一级毛片视频免费 | 久久人人爽人人爽 | 亚洲一区二区三区91 | 五月天激情视频 | 日韩av成人 | 91麻豆精品国产91久久久更新时间 | 九九精品九九 | 国产免费一区二区在线看 | 天天综合色网 | 精品久久久久久久人人人人传媒 | 国产精品国产精品国产专区不卡 | 亚洲在线xoxo日本在线 | 91www成人久久 | 欧美一区二区三区在线视频 | 亚洲欧美偷拍自拍 | 俄罗斯hdxxx 亚洲欧美视频在线播放 | 日韩伦理一区 | 日韩免费电影 | 一本色道久久88综合亚洲精品高清 | 国产黄的网站免费 |