如何在流中搜索字符并使用管道向后推送

时间:2017-01-31 12:46:34

标签: c pipe fork

我想在流中搜索字符并在流中推回而不消耗任何数据。 我正在使用fgetc,但程序仍停留在callling fgetc上。

下面是我的测试程序。

int main(void)
{
  int     fd[2], nbytes;
  pid_t   childpid;
  char    string[] = "Hello, world!\n";
  char    readbuffer[80];

  pipe(fd);

  if((childpid = fork()) == -1)
    {
      perror("fork");
      exit(1);
    }

  if(childpid == 0)
    {
      /* Child process closes up input side of pipe */
      close(fd[0]);

      /* Send "string" through the output side of pipe */
      write(fd[1], string, (strlen(string)+1));
      exit(0);
    }
  else
    {
      /* Parent process closes up output side of pipe */
      close(fd[1]);
      int dummy;
      fd_set set;
      struct timeval timeout;
      FD_ZERO (&set);
      FD_SET (fd[0], &set);
      timeout.tv_sec = 1;
      timeout.tv_usec = 0;
      if (select (fd[0]+1, &set, NULL, NULL, &timeout))
        {
          dummy = fgetc (stdin);
          ungetc (dummy, stdin);
          // Search for character
          if (dummy == 0x03)
               // Todo  
        }
    }

  return(0);
}

那么,为什么程序卡在fgetc上的代码有什么问题。

2 个答案:

答案 0 :(得分:0)

您正在尝试fgetc stdin(这是您的终端),而不是管道。您没有在任何地方使用管道。尝试了解您的代码实际在做什么。

我认为你打算将管道fd dup2改为0,即stdin fd。有成千上万的例子。

如果没有Libc的缓冲,或者你自己实现它,你就不能按照自己的要求行事 - 一旦从管道中读取一个字节,它就会从管道中消失。

答案 1 :(得分:0)

我认为有两个问题。一个是从流中消耗一个字节后,就无法将其推回。其次,fgetc是一个阻塞函数,它会等到数据可用,如果没有,你就不能告诉fgetc返回(或者甚至在达到超时后返回)。

对于第一个问题,您可以通过缓冲区包装相关的流,然后在整个程序中使用该缓冲区,预取将起作用。

对于第二个问题,请参阅non blocking I/O上的此(或类似)帖子(如果有帮助,请不要忘记提及参考答案)。