我已执行此代码。 我知道消息的顺序是任何顺序(因为我明确没有使用信号量) 我的程序流程如何?为什么?
父母被执行所以“baz”被打印一次。有人可以解释为什么“条”不打印?为什么我得到“foo”(if语句为真)两次而不是一次或三次(不是我想要这个,但我想理解逻辑)(因为一位同事说我应该得到三次foo它)?
<div id="choose" style="width:240px; height:150px; margin-left:30px; margin-top:50px; background-color:#FF0; cursor: pointer; font-size:130px; text-align:center;" onclick="theFunction();">
答案 0 :(得分:1)
pyversion
version: '2.7'
executable: 'C:\Python27\python.exe'
library: 'C:\windows\system32\python27.dll'
home: 'C:\Python27'
isloaded: 0
没有返回,它用/ bin / echo替换整个过程映像。
因此,零&#34; bar&#34; s。
execl
有两个&#34; foo&#34; s。
if (execl("/bin/echo", "/bin/echo", "foo", 0) == -1) {
fork();
}
/* Not reached if execl succeeded.
Because the exec family of functions replace the process image with
another executable. Flow will never return, unless there is an
error. */
printf("bar\n");
有一个&#34; baz&#34;。
int p;
p = fork();
/* Two processes now */
if (fork()==0) {
/* Two child processes here. */
execl("/bin/echo", "/bin/echo", "foo", 0); /* (Simplification) */
/* Two (/bin/echo foo) here, flow will never return back */
}
答案 1 :(得分:0)
首先,您需要了解系统调用的exec
系列将其他程序替换为整个程序。在你的情况下,&#34; echo&#34;程序。超出execl
电话的任何内容都不会被执行。
以下是发生的事情:
p=fork()
,它将分支克隆进程p 1 。p 0 然后执行打印&#34; baz&#34;的else语句的主体。
分叉后,p 1 执行if (fork()==0)
语句,该语句分叉另一个进程p 3 。与p 0 一样,p 1 将进入else语句,但不会打印&#34; baz&#34;因为在{sub> 0 分叉时设置的p
p 1 实际上等于0(因为p 1 是p的子项<子> 0 子>)。
p 2 进入if语句体并执行execl函数,该函数用打印&#34; foo&#34;的
与p 2 一样,p 3 进入if语句体并执行execl函数,该函数用打印&#的echo程序替换当前程序34; FOO&#34;
答案 2 :(得分:0)
第一个fork
创建两个进程,
然后他们都做了第二次分叉。
p0 (p=$pid) //first fork
p1 (p==0)
p01 p11 //second fork
exec exec
在叶子(p01
和p11
)中,第二个fork
后跟exec
,如果成功,则结束旧的过程图像。这应该会在foo
上为您提供两个stdout
。
父母(p0
和p1
)然后执行:
if (p!=0) execl("/bin/echo", "/bin/echo", "baz", 0);
p!=0
测试只能在p0
(原始流程)中成功。
这应该会在baz
上为您提供一个stdout
。
(在实际代码中,您还应检查fork
错误。)