【问题标题】:Feeding an input stream with EOF使用 EOF 提供输入流
【发布时间】:2009-05-27 14:46:27
【问题描述】:

我正在构建一个执行各种命令的小型 shell 解释器,我通过分叉我的进程来完成此任务。

但是,我希望子进程停止等待标准输入流中的输入,并且它通过期待 EOF 来实现。如何故意将 EOF 推送到该流中?

更具体地说,如果我在这种情况下循环:

while (fgets(&input, 1024, stdin) != NULL) { // .....

我怎样才能让它变成假的?

【问题讨论】:

  • 您需要提供更多信息。孩子的标准输入是否连接到父母(又名协同进程)?还是……?
  • @Chris EOF 通常是 -1 的#define
  • 说 EOF 可能比 -1 稍微好一点,但我不知道它在大多数情况下是否重要。
  • 是什么让你认为 putchar(-1) 会像提问者想要的那样做?

标签: c io


【解决方案1】:

不确定你的 shell 在做什么——但我认为这样做的方法是关闭 fork() 子端的“标准输入流”,然后不要费心从中读取再次。如果你已经 fork 一个孩子做某事,为什么它会退回到主输入处理循环中。

在伪代码中

if (pid = fork())
{
    // parent - wait for child to do it's thing and then process another command
}
else
{
    // child
    close(0);
    // do some sort of command processing and then exit 
}

【讨论】:

  • 听起来很合理。如何在 C 中“关闭”标准输入?
【解决方案2】:

正常的方法是在发送(父)端关闭流。

【讨论】:

  • 你是怎么打开的?通常,您会使用 close() 系统调用或类似的方法。
  • 就像我说的,我只是用 fgets() 从标准输入读取字符
  • 所以父母没有为孩子提供数据?我认为您需要在问题中更详细地描述您的架构。
【解决方案3】:

你不只是关闭管道的另一端吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 2013-12-14
    • 1970-01-01
    • 2017-02-22
    • 2021-11-23
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多