Unix:分叉并等待
Unix: fork and wait
这里是命令源代码中最后一部分我不明白的部分。
来源:http://v6shell.org/history/if.c, with Syntax-Highlighting: http://pastebin.com/bj0Hvfrw
if(eq(a, "{")) { /* execute a command for exit code */
if(fork()) /*parent*/ wait(&ccode);
else { /*child*/
doex(1);
goto err;
}
while((a=nxtarg()) && (!eq(a,"}")));
return(ccode? 0 : 1);
}
如手册页(http://man.cat-v.org/unix-6th/1/if)所述,如果我们将命令放在括号“if expr { command }”中,我们可以获得他的退出代码。
所以我们fork当前进程,然后等待我们的子进程完成?但是我们的子进程在哪里继续他的工作呢?在 fork 之后,我们将进入 while 循环并跳过一些参数然后 return with ccode? ccode哪里改了?什么是代码?
你能解释一下给定的代码片段吗?
并详细说明ccode?
fork
splits the current process in two: it makes a new process, running the same code, which begins running from the same point as the fork
call。 fork
returns 父子进程中的不同值:在父进程中,它 returns 子进程的 PID,在子进程中它 returns 零。 PID 是一个真值,所以 wait
调用只在父级执行(如评论所说),而“else
”分支只在子级执行(如其评论所说)。两个进程从 fork
点开始并行执行。
doex
performs an exec
of another program, replacing the child process and terminating with the new process's exit code。只有 doex
调用和 execv
在当前程序的子进程中执行。
wait
:
causes its caller to delay until one of its child processes terminates.
也就是说,它会导致父项暂停,直到子项退出。它传递一个指向 int
变量的指针,并将子进程的退出信息写入该变量。 ccode
在封闭函数的其他地方定义。子进程的退出代码将是 exec
ed 命令的退出代码。
当 ccode
被赋予一个非零值时,表示 运行 程序出错。在这种情况下,函数 returns 为零,否则 returns 1 向其调用者指示成功。
我鼓励您查看 POSIX/the Single Unix Specification、ISO C 标准或标准 C 编程教科书,以帮助理解此代码库中发生的事情。您 link 的手册页也描述了函数的作用,但通常较新的版本会填补空白或通常更清晰,并且行为没有太大变化。
尽管所有这些问题都与历史 Unix 相关,并且当时 Unix 和 C 之间的相互作用以及在此期间对两者的后续更改使它们可以说是切合主题的,但它们也是初级编程问题(因此可以说是题外话)。
这里是命令源代码中最后一部分我不明白的部分。
来源:http://v6shell.org/history/if.c, with Syntax-Highlighting: http://pastebin.com/bj0Hvfrw
if(eq(a, "{")) { /* execute a command for exit code */
if(fork()) /*parent*/ wait(&ccode);
else { /*child*/
doex(1);
goto err;
}
while((a=nxtarg()) && (!eq(a,"}")));
return(ccode? 0 : 1);
}
如手册页(http://man.cat-v.org/unix-6th/1/if)所述,如果我们将命令放在括号“if expr { command }”中,我们可以获得他的退出代码。
所以我们fork当前进程,然后等待我们的子进程完成?但是我们的子进程在哪里继续他的工作呢?在 fork 之后,我们将进入 while 循环并跳过一些参数然后 return with ccode? ccode哪里改了?什么是代码?
你能解释一下给定的代码片段吗? 并详细说明ccode?
fork
splits the current process in two: it makes a new process, running the same code, which begins running from the same point as the fork
call。 fork
returns 父子进程中的不同值:在父进程中,它 returns 子进程的 PID,在子进程中它 returns 零。 PID 是一个真值,所以 wait
调用只在父级执行(如评论所说),而“else
”分支只在子级执行(如其评论所说)。两个进程从 fork
点开始并行执行。
doex
performs an exec
of another program, replacing the child process and terminating with the new process's exit code。只有 doex
调用和 execv
在当前程序的子进程中执行。
wait
:
causes its caller to delay until one of its child processes terminates.
也就是说,它会导致父项暂停,直到子项退出。它传递一个指向 int
变量的指针,并将子进程的退出信息写入该变量。 ccode
在封闭函数的其他地方定义。子进程的退出代码将是 exec
ed 命令的退出代码。
当 ccode
被赋予一个非零值时,表示 运行 程序出错。在这种情况下,函数 returns 为零,否则 returns 1 向其调用者指示成功。
我鼓励您查看 POSIX/the Single Unix Specification、ISO C 标准或标准 C 编程教科书,以帮助理解此代码库中发生的事情。您 link 的手册页也描述了函数的作用,但通常较新的版本会填补空白或通常更清晰,并且行为没有太大变化。
尽管所有这些问题都与历史 Unix 相关,并且当时 Unix 和 C 之间的相互作用以及在此期间对两者的后续更改使它们可以说是切合主题的,但它们也是初级编程问题(因此可以说是题外话)。