【问题标题】:Writing a shell in c, question about ($?) value用c写一个shell,关于($?)值的问题
【发布时间】:2020-10-11 04:06:54
【问题描述】:

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

【问题讨论】:

  • 这将由各种 wait 函数返回,您必须调用这些函数才能确定进程是否已退出
  • 哦,这听起来像是一堂课。我发现非常好的一本书是《UNIX 环境中的高级编程》。我不知道这是否仍然是一本教科书,或者你是否被分配了类似的东西。但是,如果您希望从事大量涉及 UNIX 的工作,您可能需要这本书。
  • 是的,我通过这个项目来学习。我的问题解决了。感谢大家的回答和赞的书推荐。

标签: c shell unix


【解决方案1】:

调用fork后,父进程需要等待子进程完成。它很可能使用waitpid 来执行此操作。当它调用waitpid 时,它可以将一个指针传递给它想要获取子进程的“状态信息”的内存位置,包括它的退出状态。有关如何解读“状态信息”的详细信息,请参阅the waitpid documentation

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多