bash支持forking类似于C的fork()吗?

Modified on: Sat, 30 Jun 2018 06:06:00 +0800

我有一个脚本,我想在一个点上分叉,所以同一个脚本的两个副本正在运行。

例如,我希望存在以下bash脚本:

echo $$
do_fork()
echo $$

如果此bash脚本确实存在,则预期输出为:

<ProcessA PID>
<ProcessB PID>
<ProcessA PID>

<ProcessA PID>
<ProcessA PID>
<ProcessB PID>

有什么东西可以代替“do_fork()”来获得这种输出,或者让bash脚本做一个类似C的分支吗?

最佳答案

是。分叉拼写为&amp;

echo child & echo parent

你可能会感到困惑的是$$不是shell进程的PID,它是原始 shell进程的PID。这样做的关键是$$是shell脚本的特定实例的唯一标识符:它在脚本执行期间不会更改,并且与$$在任何其他并发运行的脚本中。获取shell进程实际PID的一种方法是sh -c 'echo $PPID'

shell中的控制流程与C不同。如果是C,则写入

first(); fork(); second(); third();

然后是一个等效的shell

first(); fork(); second(); third();

简单的shell首先形成first; child &amp; parent对应于通常的C idiom

first(); if (fork()) parent(); else child();

&amp;$$在每个Bourne样式shell和(t)csh中都存在并以这种方式运行。 orignal Bourne shell中不存在$PPID,但是在POSIX中(所以它在ash,bash,ksh,zsh,...)。

作者:,Gilles

相关问答

添加新评论