Unix:fork等待

Joe*_*oey 2 shell history command

这是命令源代码中我不理解的最后一部分if.

资料来源:http://v6shell.org/history/if.c,包含语法 - 突出显示: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);
}
Run Code Online (Sandbox Code Playgroud)

如man-page(http://man.cat-v.org/unix-6th/1/if)中所述,如果我们将命令放在括号" if expr {command} "中,我们可以获得他的退出代码.

那么我们分叉当前进程,然后等待我们的子进程完成?但是我们的孩子继续他的工作在哪里?在fork之后,我们将进入while循环并且只是跳过一些参数然后用ccode返回?ccode在哪里改变了?什么是ccode?

你能解释一下给定的代码片段吗?并详细说明ccode?

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

Mic*_*mer 7

fork将当前进程分为两部分:它创建一个新进程,运行相同的代码,从与fork调用相同的点开始运行.fork在父级和子级中返回不同的值:在父级中,它返回子进程的PID,在子级中返回零.PID是一个真值,因此wait调用仅在父级中执行(如注释所示),而" else"分支仅在子级中执行(如其注释所示).两个进程从一fork开始就并行执行.

doex执行exec另一个程序,替换子进程并终止新进程的退出代码.只有来自当前程序的子进程中的doex调用和execv执行.

wait:

导致其调用者延迟,直到其子进程之一终止.

也就是说,它会导致父母暂停,直到孩子退出.它传递一个指向int变量的指针,并将子进程的退出信息写入该变量.ccode在封闭函数的其他地方定义.子进程的退出代码将是已exec编辑的命令的退出代码.

ccode赋予非零值时,表示运行程序时出错.在这种情况下,函数返回零,否则返回1表示其调用者成功.


我鼓励您查看POSIX /单Unix规范,ISO C标准或标准C编程教科书,以帮助理解此代码库中正在发生的事情.您链接到的手册页也描述了这些函数的作用,但通常较新的版本填补了空白或通常更清晰,并且行为没有太大变化.

虽然所有这些问题都与历史Unix有关,但是当时Unix和C之间的相互作用加上随后时间间的变化使得它们可以说是主题,它们也是基本的编程问题(可以说是无关).