|
|
发表于 2008-8-10 00:09:02
|
显示全部楼层
Post by sdew;1884254
这里还有个不理解的,你说shell遇到&会先开一个shell再执行命令,那我之前的那个例子里命令只有(urxvt &) 那按理来说pstree的时候应该看到urxvt前面还应该有个bash
这里urxvt的父进程应该就是sh,而不是再多加一个bash
shell执行命令的基本过程是
对于每一个命令,先fork,然后在子进程里exec该命令
- if (pid=fork()) {
- waitpid(pid....);
- } else {
- execlp("command"...);
- }
复制代码
也就是说本来这个子进程执行命令的方式就是exec
实际上这是unix里执行新命令(也就是开启新进程)的唯一方式:先fork,创建一个和父进程一模一样的进程,然后再在子进程里exec,用新的一个程序文件替换当前进程的内存镜像
如果这个命令是exec command,那么就又fork出来的子进程来exec command
所以没有区别
Post by sdew;1884254
所以我认为当有&存在时那个exec就被无视了,而不是产生一个subshell后再被exec去替换。
我粗略的看了看,没有发现这样的代码
如果你有兴趣继续研究,给你一个提示
具体的处理&的代码在这个文件的928和930行
http://www.google.com/codesearch ... qjD2e8qFHg |
|