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?

等待手册页:http://man.cat-v.org/unix-6th/2/wait

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 callfork 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 在封闭函数的其他地方定义。子进程的退出代码将是 execed 命令的退出代码。

ccode 被赋予一个非零值时,表示 运行 程序出错。在这种情况下,函数 returns 为零,否则 returns 1 向其调用者指示成功。


我鼓励您查看 POSIX/the Single Unix Specification、ISO C 标准或标准 C 编程教科书,以帮助理解此代码库中发生的事情。您 link 的手册页也描述了函数的作用,但通常较新的版本会填补空白或通常更清晰,并且行为没有太大变化。

尽管所有这些问题都与历史 Unix 相关,并且当时 Unix 和 C 之间的相互作用以及在此期间对两者的后续更改使它们可以说是切合主题的,但它们也是初级编程问题(因此可以说是题外话)。