Session 为什么XMonad在新会话中运行子进程?
我有一些关于XMonad运行程序过程的问题。我希望这些问题的答案也能解释在X环境中运行应用程序的“规范”方式 XMonad使用函数“”运行终端仿真器和程序启动器(例如gmrun) 此函数调用'spawnPID',它构造'/bin/sh cmd'命令 问题1:为什么我们需要执行“/bin/sh-c cmd”,而不仅仅是“cmd” 我的假设:用于解析参数,可以将其添加到xmonad.hs中的命令中 进一步。对于名为“xfork”函数的执行构造命令“spawnPID”,该函数: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进程(可能是
- fork进程(可能是为了防止进程成为组长,setsid syscall要求)李>
- 恢复默认的SIGPIPE和SIGCHLD(看起来像forkProcess行为解决方案)李>
- 调用“createSession”(setsid系统调用包装器)李>
- 执行在“spawnPID”中构造的命令
这可能是处理执行程序的更好方法。但是我在这方面并不专业,只是简单地阅读了文档。我认为使用
/bin/sh
可能只是为了让您可以传递一个命令名,然后sh
在PATH
中搜索它。executeFile”函数可以在路径目录本身执行搜索可执行文件。我同意@AlexanderTurenko;我认为sh-c
的原因是为了得到命令的shell解析——例如扩展globs、允许链接、允许变量插值等等。不过,不知道会话和分叉的动机。