您尚未登录。

#1 2018-06-09 21:38:18

reules
请叫我拉欧
所在地: 目泥潶
注册时间: 2018-06-07
帖子: 11

关于xinit的问题

archlinux wiki上面xinit词条下有一段话不是很明白。

xinitrc那一段这么写的:

“~/.xinitrc 中应该只有 一个 未注释掉的 exec 行,而且 exec 行必须位于配置文件的末尾。exec 后面的所有命令只有窗口退出后才会被执行。在窗口管理器前启动的命令,例如屏保和壁纸程序,必须自行 fork 后台进程或用&在后台启动, 否则启动程序会等待它们退出才会启动窗口管理器或桌面环境。使用 exec 作为前缀会替换当前的进程,这样进程进入后台时 X 不会退出。”

最后一句话说 使用exec作为前缀会替换当前进程,这样进程进入后台是X不会退出。我能理解exec会替换当前进程,但是后面这句不能理解,是说exec执行后的进程(比如窗口管理器进程)进入后台X不会退出还是窗口管理器进程之前exec出来的X server进程进入后台?

离线

#2 2018-06-09 22:27:49

Remilia
RemiliaForever
注册时间: 2016-03-14
帖子: 49
个人网站

Re: 关于xinit的问题

英文原文是

Prepending exec will replace the script process with the window manager process,  so that X does not exit even if this process forks to the background.


我的理解是exec将当前进程替换为窗口管理器进程,所以在窗口管理器退出前,后台的X server进程不会退出(这里this process应该是指后台的X server吧)。

我也不清楚哪个了...流程大概是这样:
xinit会先fork一个子进程执行xserverrc,然后再fork一个子进程执行xinitrc。主进程调用wait等待其中一个结束后,结束另一个及所有子进程并清理现场。

最近编辑记录 Remilia (2018-06-09 23:31:55)

离线

#3 2018-06-10 00:12:10

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,956
个人网站

Re: 关于xinit的问题

exec 后面的所有命令只有窗口退出后才会被执行

这句话是错的。如果有 set -e 的话,那些命令永远不会执行;如果没有,exec 失败了才会执行。

离线

#4 2018-06-10 05:09:37

reules
请叫我拉欧
所在地: 目泥潶
注册时间: 2018-06-07
帖子: 11

Re: 关于xinit的问题

Remilia 说:

英文原文是

Prepending exec will replace the script process with the window manager process,  so that X does not exit even if this process forks to the background.


我的理解是exec将当前进程替换为窗口管理器进程,所以在窗口管理器退出前,后台的X server进程不会退出(这里this process应该是指后台的X server吧)。

我也不清楚哪个了...流程大概是这样:
xinit会先fork一个子进程执行xserverrc,然后再fork一个子进程执行xinitrc。主进程调用wait等待其中一个结束后,结束另一个及所有子进程并清理现场。

看这段英文感觉xinit没有fork xinitrc吧,xinit程序fork了x server到后台,然后x client直接替换了xinit程序。如果xclient程序结束了,相当与原来的xinit也结束了,所以其fork出来的xserver则也会结束。不知道是不是这样理解

最近编辑记录 reules (2018-06-10 05:52:33)

离线

#5 2018-06-10 08:54:34

Remilia
RemiliaForever
注册时间: 2016-03-14
帖子: 49
个人网站

Re: 关于xinit的问题

reules 说:

看这段英文感觉xinit没有fork xinitrc吧,xinit程序fork了x server到后台,然后x client直接替换了xinit程序。如果xclient程序结束了,相当与原来的xinit也结束了,所以其fork出来的xserver则也会结束。不知道是不是这样理解

我看英文也挺纳闷的。
看了下xinit的源码

    if (startServer(server) > 0
        && startClient(client) > 0) {
        pid = -1;
        while (pid != clientpid && pid != serverpid
               && gotSignal == 0
            )
            pid = wait(NULL);
    }
    ...
    shutdown();

两个start里都有fork(),shutdown里有两个killpg()。
然后看了下进程树,确实是主进程是xinit,两个子进程一个Xorg,一个窗口管理器。

离线

#6 2018-06-10 16:09:29

reules
请叫我拉欧
所在地: 目泥潶
注册时间: 2018-06-07
帖子: 11

Re: 关于xinit的问题

Remilia 说:
reules 说:

看这段英文感觉xinit没有fork xinitrc吧,xinit程序fork了x server到后台,然后x client直接替换了xinit程序。如果xclient程序结束了,相当与原来的xinit也结束了,所以其fork出来的xserver则也会结束。不知道是不是这样理解

我看英文也挺纳闷的。
看了下xinit的源码

    if (startServer(server) > 0
        && startClient(client) > 0) {
        pid = -1;
        while (pid != clientpid && pid != serverpid
               && gotSignal == 0
            )
            pid = wait(NULL);
    }
    ...
    shutdown();

两个start里都有fork(),shutdown里有两个killpg()。
然后看了下进程树,确实是主进程是xinit,两个子进程一个Xorg,一个窗口管理器。

ok,理解了,多谢大神帮忙:D

离线

页脚