【问题标题】:Redericting stdout and stdin重新编辑标准输出和标准输入
【发布时间】:2011-11-21 21:23:20
【问题描述】:

我想将标准输出、标准错误重新编入文件,并将标准输入从 char*。我的目标是用 C 语言实现它。

当我运行这段代码时:

int main(){
        stdout=fopen("/home/user/file.txt","w");
    printf("aaaa");
    printf("\nbbbb");
    system("/bin/bash");
    sprintf("stdin","exit");
    return 0;
}

文件没有某些字符串,而 bash 从控制台获取参数。哪里有bug??

【问题讨论】:

  • 我在理解你的问题时遇到了一些麻烦,但在我看来你想将bash 的输出重定向到一个文件......对吗?
  • 您可以使用close() 关闭文件描述符(甚至是标准输入等),并使用不同的句柄打开它们...

标签: c stdout filestream stdin


【解决方案1】:

您不想分配给stdout。相反,您(可能)想使用freopen,在您的情况下,例如:freopen("/home/user/file.txt","w", stdout);

如果/当您在内部进行所有处理时,通常最好编写代码以接收 FILE * 作为参数,并传递正确的值。但是,当您有直接写入 stdout 的外部代码时,这不起作用。

编辑:我可能还应该提到freopen 的另一个严重问题——没有提供将其恢复到上一个​​流的方法。您可以再次使用freopen,并知道将写入控制台(或其他)的路径。

【讨论】:

    【解决方案2】:

    stdout 不应用作左值。尝试使用 fprintf() 函数而不是 printf() 以获得所需的效果。

    至于从 bash 重定向标准输出,你能不能直接用 /usr/bin/bash >> /home/user/file.txt 调用它?

    【讨论】:

      【解决方案3】:
      #include <stdio.h>
      #include <stdlib.h>
      #include <io.h>
      
      int main(void){
          int ret;
          FILE *fp;
          int  stdout_bk;
      
          stdout_bk = dup(fileno(stdout));
          fp=fopen("/home/user/file.txt","w");
          dup2(fileno(fp), fileno(stdout));
          ret = system("/bin/bash");
          //flushall();//for vc
          fflush(stdout);//for gcc 
          fclose(fp);
      
          dup2(stdout_bk, fileno(stdout));//restore
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2010-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 2013-09-18
        • 1970-01-01
        • 2013-06-13
        • 2012-03-16
        相关资源
        最近更新 更多