我对 XMonad 运行程序程序有一些疑问。我希望这些问题的答案也能解释在 X 环境中运行应用程序的“规范”方式。
XMonad 使用函数“ spawn ”来运行终端模拟器和程序启动器(例如 gmrun)。
这个函数调用'spawnPID',它构造了'/bin/sh cmd'命令。
问题一:为什么我们需要执行'/bin/sh -c cmd',而不是简单的'cmd'?
我的假设:用于解析参数,可以添加到 xmonad.hs 中的命令中。
更远。对于执行构造命令 'spawnPID' 称为 'xfork' 函数,其中:
- fork 进程(可能是为了防止进程成为组长,setsid 系统调用需要);
- 恢复默认的 SIGPIPE 和 SIGCHLD(看起来像 forkProcess 行为解决方法);
- 调用“createSession”(setsid 系统调用包装器);
- 执行在“spawnPID”中构造的命令。
问题 2(主要):为什么 XMonad 在它自己的会话中执行每个子进程?
在我看来,会话主要与用户登录会话或“用户独立”程序相关联,即。e. 守护进程。不是在一个登录会话下的每个单独的程序。
问题3:为什么连forkProcess+executeFile都用到了,而不是shell+createProcess或者proc+createProcess?
'forkProcess' 似乎已部分弃用(在某些情况下,在多处理器系统下,请参阅此),但在这种情况下,'createProcess' 必须正常工作,并且支持在 shell 下执行而无需键入 '/bin/sh -c'。
这可能是处理执行程序的更好方法。但我对此并不专业,只是简单地阅读了文档。