页次: 1
archlinux wiki上面xinit词条下有一段话不是很明白。
xinitrc那一段这么写的:
“~/.xinitrc 中应该只有 一个 未注释掉的 exec 行,而且 exec 行必须位于配置文件的末尾。exec 后面的所有命令只有窗口退出后才会被执行。在窗口管理器前启动的命令,例如屏保和壁纸程序,必须自行 fork 后台进程或用&在后台启动, 否则启动程序会等待它们退出才会启动窗口管理器或桌面环境。使用 exec 作为前缀会替换当前的进程,这样进程进入后台时 X 不会退出。”
最后一句话说 使用exec作为前缀会替换当前进程,这样进程进入后台是X不会退出。我能理解exec会替换当前进程,但是后面这句不能理解,是说exec执行后的进程(比如窗口管理器进程)进入后台X不会退出还是窗口管理器进程之前exec出来的X server进程进入后台?
离线
英文原文是
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)
离线
exec 后面的所有命令只有窗口退出后才会被执行
这句话是错的。如果有 set -e 的话,那些命令永远不会执行;如果没有,exec 失败了才会执行。
离线
英文原文是
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)
离线
看这段英文感觉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,一个窗口管理器。
离线
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
离线
页次: 1