【问题标题】:Re-creating STDIN Redirection in C在 C 中重新创建 STDIN 重定向
【发布时间】:2013-02-13 17:41:38
【问题描述】:

我正在尝试创建一个重定向 IO 的 C 程序。我已经完成了小菜一碟的输出,但输入似乎更难。也许我只是不太了解这一切,但我正在做这样的事情:

  int redFile;

  fflush(stdin);

  myio = dup(0);

  redFile = open(rhs, O_WRONLY, 0644); 

  dup2(redFile, 0);
  close(redFile);

  // Any scanf("%s", &buf) here should read from my redFile (correct?) into some buffer, buf[64] or something

   fflush(stdin);
   dup2(myio, 0);
   close(myio);

所以现在我有一些 buf[64],其中包含来自文件 redFile 的字符串,但是如何将其作为 char * lhs(在程序前面设置)指定的命令的输入。我的整个程序使用 execve() 基本上创建了一个虚拟外壳。

我需要能够处理一些类似的事情:

输入.txt:

test1
test2
test3

tac < input.txt > output.txt

输出.txt

test3
test2
test1

【问题讨论】:

  • fflush(stdin);fflush(stdout); 之一是未定义的行为 - 我怀疑它是输出行为。如果省略了怎么办?
  • 我在程序的这一部分不使用 fflush(stdout) 吗?我认为这与我的问题无关
  • 在您发布的代码中,有 两个 调用fflush(stdin);
  • @H2CO3 它的stdin,顺便说一句,这是不花哨的=P
  • @WhozCraig 谢谢。所以我的怀疑实际上是正确的,对吧?

标签: c unix file-io


【解决方案1】:

如果您希望缓冲区的内容作为进程的输入,则需要将该数据写入管道。基本上,您需要创建一个管道然后分叉。子进程将复制其输入以通过dup2( pfd[ 0 ], STDIN_FILENO ) 从管道中读取,然后执行,而父进程将数据写入管道的另一端。

【讨论】:

  • 那么 pfd[0] 到底是什么?
  • pfd[0] 是管道的读取端。 (使用int pfd[2]; pipe(pfd) 创建)
  • 好的,所以我已经完成了 dup2(myPipe[0], 0) 的所有设置,但是我仍然不确定如何从文件中获取字符串?一旦这个 myPipe[0] 接管了 STDIN,我如何告诉我的程序从文件中读取到管道中?
  • 子进程不会从文件中读取,而是从标准输入中读取。不过,我很困惑:在您的问题中,您说“现在我有一些 buf[64] ,其中包含来自文件的字符串”。父级只需将该数据写入管道,然后子级将从标准输入读取它(从管道的读取端复制)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多