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?
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之间的相互作用加上随后时间间的变化使得它们可以说是主题,它们也是基本的编程问题(可以说是无关).