用c编写shell,关于($?)值的问题

用c编写shell,关于($?)值的问题,c,shell,unix,C,Shell,Unix,我正在用c写一个shell。我必须实现的构建之一是“echo”,我想知道如何获得$的值?如果我的命令是“ls filename”;echo$?'。在这种情况下,我必须使用fork创建一个新进程,并使用execv在系统中运行二进制ls,在执行ls之后,我如何知道ls的退出状态?调用fork后,父进程需要等待子进程完成。它很可能使用waitpid来实现这一点。当它调用waitpid时,它可以将一个指针传递给一个内存位置,在那里它想要获取子进程的“状态信息”,包括它的退出状态。有关如何解释“状态信息”

我正在用c写一个shell。我必须实现的构建之一是“echo”,我想知道如何获得$的值?如果我的命令是“ls filename”;echo$?'。在这种情况下,我必须使用fork创建一个新进程,并使用execv在系统中运行二进制ls,在执行ls之后,我如何知道ls的退出状态?

调用
fork
后,父进程需要等待子进程完成。它很可能使用
waitpid
来实现这一点。当它调用
waitpid
时,它可以将一个指针传递给一个内存位置,在那里它想要获取子进程的“状态信息”,包括它的退出状态。有关如何解释“状态信息”的详细信息,请参阅。

您可以通过几种方式等待任何PID,而不是等待特定的PID。您可以为SIGCHLD安装一个信号处理程序,并在处理程序调用
wait(&status)
中,它将返回PID并存储进程退出状态

或者,您可以使用
sigaction
SA_SIGINFO
标志安装信号处理程序。然后,信号处理程序将有一个扩展签名,其中包括一个
siginfo\u t*
参数,对于SIG\u CHLD信号,它将包含PID和状态

或者,您可以使用
wait
waitpid
(PID为-1)代替信号处理程序来等待任何进程,并且它将返回退出的进程的PID。假设您的程序正在跟踪它分叉了多少子进程,您将处理该进程并返回等待下一个进程


如果您的shell具有允许运行和跟踪任意数量后台进程状态的作业控制,等待任何退出都很重要。

这将由各种
wait
函数返回,您必须调用这些函数才能确定进程是否已退出。这听起来像是一个类。我发现一本非常好的书是UNIX环境中的高级编程。我不知道这是否仍然是一本教科书,或者你是否被分配了类似的任务。但是,如果您希望在UNIX方面做大量工作,您可能会想要那本书。我的问题解决了。谢谢你的回答和赞恩的推荐书。