我想在流中搜索字符并在流中推回而不消耗任何数据。 我正在使用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上的代码有什么问题。
答案 0 :(得分:0)
您正在尝试fgetc
stdin
(这是您的终端),而不是管道。您没有在任何地方使用管道。尝试了解您的代码实际在做什么。
我认为你打算将管道fd dup2
改为0,即stdin fd。有成千上万的例子。
如果没有Libc的缓冲,或者你自己实现它,你就不能按照自己的要求行事 - 一旦从管道中读取一个字节,它就会从管道中消失。
答案 1 :(得分:0)
我认为有两个问题。一个是从流中消耗一个字节后,就无法将其推回。其次,fgetc
是一个阻塞函数,它会等到数据可用,如果没有,你就不能告诉fgetc
返回(或者甚至在达到超时后返回)。
对于第一个问题,您可以通过缓冲区包装相关的流,然后在整个程序中使用该缓冲区,预取将起作用。
对于第二个问题,请参阅non blocking I/O上的此(或类似)帖子(如果有帮助,请不要忘记提及参考答案)。