亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

startx啟動過程分析

系統(tǒng) 2288 0

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

startx 啟動過程分析

?

?

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 默認啟動過程

3.1 ?????? startx 的幾種啟動方式

3.2 ?????? Xsession

4 ????? startx 啟動過程小結(jié)

?

1 ??????? xinit

在說明 startx 之前,我想我們應該先了解一下 xinit 。因為 startx 就是通過調(diào)用 xinit 啟動X的。

1.1 ???? 功能

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

1.2 ???? 用法

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

?

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

?

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

?

1.3 ???? 例子

下面是幾個關(guān)于 xinit 應用的例子:

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

該例子將啟動X? server ,?同時將會啟動xclock。請注意指定client或 server 時,需要用絕對路徑,否則 xinit 將因無法區(qū)別是傳給xterm或 server 的參數(shù)還是指定的client或 server 而直接當成是參數(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
      
    
  

xinit 啟動時,它會先啟動X? server ,然后啟動一個clock,兩個xterm,最后啟動窗口管理器twm。

請注意:

最后一個命令不能后臺運行,否則所有命令都后臺運行的話xinit就會返回退出,同樣的,除最后一個命令外都必須后臺運行,否則后面的命令將只有在該命令退出后才能運行。

?

1.4 ???? 分析

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

X&

export DISPLAY=:0.0

xterm

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

?

?

2 ??????? startx 腳本

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

2.1 ???? 功能

當我們在終端下想啟動圖形界面時,我們都會通過輸入startx來實現(xiàn),該命令可以啟動一個X server ,而且可以啟動一個漂亮的圖形界面(Ubuntu下,我裝的是gnome)。

2.2 ???? 用法

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

2.3 ???? 例子

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

1) ?? startx -- -depth 16

該例子主要是以16位色啟動X?服務器。

2) ?? startx -- -dpi 100

該例子主要是以100的dpi啟動X?服務器。

2.4 ???? 分析

下面我們來分析一下startx腳本。startx腳本位于/usr/bin下,直接用vim打開我們可以看到它的具體實現(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 $

?

#下面主要是對一些變量進行賦值。

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=""

?

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

?

if [ -f $userclientrc ]; then

????defaultclientargs=$userclientrc

elif [ -f $sysclientrc ]; then

????defaultclientargs=$sysclientrc

?

?

?

?

?

?

fi

?

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

?

if [ -f $userserverrc ]; then

????defaultserverargs=$userserverrc

elif [ -f $sysserverrc ]; then

????defaultserverargs=$sysserverrc

fi

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

whoseargs="client"

#當startx的一個參數(shù)不為空時就進入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語句結(jié)束

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

done

?

# process client arguments

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

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

????if [ x"$clientargs" = x ]; then #如果用戶沒有指定client參數(shù)?就將client設(shè)為前面設(shè)定的默認的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變量為空,即用戶沒有指定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è)定的默認的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長度為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"

?

# 下面的語句通過xinit 啟動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é)

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

?

?

3 ??????? startx 默認啟動過程

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

3.1 ???? startx 的幾種啟動方式

由對startx腳本的分析,我們可以知道 startx 主要有三種啟動方式:

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

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

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

?

我們主要介紹最后一種啟動方法。

?

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

?

/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??#在當前這個shell環(huán)境中執(zhí)行Xsession腳本

?

?

因此, gnome 的啟動應該在Xsession里。

?

而X Server的啟動則是通過系統(tǒng)文件 /etc/X11/xinit/xserverrc 來指定的,這個文件的內(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 #打開errexit選項,該選項表示:如果下面有命令返回的狀態(tài)非0,則退出程序。

?

PROGNAME=Xsession

?

#下面四個是信息輸出函數(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不存在或不是一個目錄則打印錯誤信息并退出。

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選項

??for SESSIONFILE in $SESSIONFILES; do

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

??done

??set –e #打卡errexit選項

fi

exit 0

?

從以上的對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

?

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

?

1、20x11-common_process-args

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

?

2、30x11-common_xresources

????該文件主要是調(diào)用xrdb來將/etc/X11/Xresources目錄下及$HOME/.Xresources目錄下的文件的內(nè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è)置為該文件,如果沒有執(zhí)行權(quán)限就將STARTUP變量設(shè)置為“sh?該xsession文件”。如果此時STARTUP變量仍然為空,則將其設(shè)置為x-session-manager,x-window-manager或x-terminal-emulator。注意:這個STARTUP將會在后面的腳本中被啟動。

?

5、55gnome-session_gnomerc

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

?

6、60seahorse

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

?

7、60xdg-user-dirs-update

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

?

8、80im-switch

???該文件主要用于設(shè)置輸入法。具體的請自己參考文件內(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的功能,我也不是很清楚,估計是和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啟動$STARTUP。關(guān)于exec,在Bourne shell中,它與fork的區(qū)別就在于它執(zhí)行一個新的腳本不需創(chuàng)建sub-shell,而它與Source和Dot的區(qū)別就在與在這條語句后面的語句將不會再被執(zhí)行。此時,我們可以發(fā)現(xiàn)變量$STARTUP的值為:“startup=/usr/bin/ssh-agent??/usr/bin/ck-launch-session /usr/bin/seahorse-agent --execute x-session-manager”,?因此,最終將會被執(zhí)行的就是這么一條語句。而x-session-manager在Ubuntu8.04中僅僅是個符號鏈接,它最終指向的是gnome-session。

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

?

?

?

4 ??????? startx 啟動過程小結(jié)

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

startx啟動過程分析


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品国产一区二区三区香蕉沈先生 | 午夜看毛片 | 亚洲欧洲日产国码天堂 | 国产丰满老厨女房乱 | 另类重口性色老妇 | a一级特黄日本大片 s色 | 干美女网站 | 在线看福利视频120秒 | 亚洲欧美日韩不卡一区二区三区 | 久久久久这里只有精品 | 91精品福利视频 | 日本最新在线 | 97中文字幕在线观看 | 久久久噜久噜久久综合 | 涩涩综合| 国产成人精品第一区二区 | 天天影视欧美综合在线观看 | 欧美日韩亚洲国产一区二区综合 | 久久天天躁狠狠躁夜夜躁 | 亚洲欧美日韩久久一区 | 四虎影院永久在线 | 亚洲专区第一页 | 精品视自拍视频在线观看 | 四虎最新紧急入口 | 四影虎库最新2021 | 国产免费一区二区三区在线 | 亚洲十欧美十日韩十国产 | 91www在线观看| 午夜小视频网站 | 国产精品欧美日韩视频一区 | 国产一区在线观看视频 | 天天干天天射综合网 | 国产91精品久久久久久久 | 国产一区二区三区免费 | 精品国产免费观看 | 久久99精品久久久久久综合 | 特级一级毛片视频免费观看 | 免费福利小视频 | 奇米777影视成人四色 | 欧美整片在线观看 | 日韩人成免费网站大片 |