用c编写shell,关于($?)值的问题
我正在用c写一个shell。我必须实现的构建之一是“echo”,我想知道如何获得$的值?如果我的命令是“ls filename”;echo$?'。在这种情况下,我必须使用fork创建一个新进程,并使用execv在系统中运行二进制ls,在执行ls之后,我如何知道ls的退出状态?调用用c编写shell,关于($?)值的问题,c,shell,unix,C,Shell,Unix,我正在用c写一个shell。我必须实现的构建之一是“echo”,我想知道如何获得$的值?如果我的命令是“ls filename”;echo$?'。在这种情况下,我必须使用fork创建一个新进程,并使用execv在系统中运行二进制ls,在执行ls之后,我如何知道ls的退出状态?调用fork后,父进程需要等待子进程完成。它很可能使用waitpid来实现这一点。当它调用waitpid时,它可以将一个指针传递给一个内存位置,在那里它想要获取子进程的“状态信息”,包括它的退出状态。有关如何解释“状态信息”
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方面做大量工作,您可能会想要那本书。我的问题解决了。谢谢你的回答和赞恩的推荐书。