Session 为什么XMonad在新会话中运行子进程?

Session 为什么XMonad在新会话中运行子进程?,session,haskell,launcher,xmonad,Session,Haskell,Launcher,Xmonad,我有一些关于XMonad运行程序过程的问题。我希望这些问题的答案也能解释在X环境中运行应用程序的“规范”方式 XMonad使用函数“”运行终端仿真器和程序启动器(例如gmrun) 此函数调用'spawnPID',它构造'/bin/sh cmd'命令 问题1:为什么我们需要执行“/bin/sh-c cmd”,而不仅仅是“cmd” 我的假设:用于解析参数,可以将其添加到xmonad.hs中的命令中 进一步。对于名为“xfork”函数的执行构造命令“spawnPID”,该函数: fork进程(可能是

我有一些关于XMonad运行程序过程的问题。我希望这些问题的答案也能解释在X环境中运行应用程序的“规范”方式

XMonad使用函数“”运行终端仿真器和程序启动器(例如gmrun)

此函数调用'spawnPID',它构造'/bin/sh cmd'命令

问题1:为什么我们需要执行“/bin/sh-c cmd”,而不仅仅是“cmd”

我的假设:用于解析参数,可以将其添加到xmonad.hs中的命令中

进一步。对于名为“xfork”函数的执行构造命令“spawnPID”,该函数:

  • fork进程(可能是为了防止进程成为组长,setsid syscall要求)
  • 恢复默认的SIGPIPE和SIGCHLD(看起来像forkProcess行为解决方案)
  • 调用“createSession”(setsid系统调用包装器)
  • 执行在“spawnPID”中构造的命令
问题2(主要问题):为什么XMonad在它自己的会话中执行每个子进程

在我看来,会话主要与用户登录会话或“用户独立”程序相关,即。守护进程。不是在一个登录会话下使用每个单独的程序

问题3:为什么使用forkProcess+executeFile,而不是shell+createProcess或proc+createProcess

“forkProcess”似乎部分被弃用(在某些情况下,在多处理器系统下,请参阅),但“createProcess”在这种情况下必须工作正常,并且支持在shell下执行,而不必键入“/bin/sh-c”


这可能是处理执行程序的更好方法。但是我在这方面并不专业,只是简单地阅读了文档。

我认为使用
/bin/sh
可能只是为了让您可以传递一个命令名,然后
sh
PATH
中搜索它。executeFile”函数可以在路径目录本身执行搜索可执行文件。我同意@AlexanderTurenko;我认为
sh-c
的原因是为了得到命令的shell解析——例如扩展globs、允许链接、允许变量插值等等。不过,不知道会话和分叉的动机。