首页 > 解决方案 > 如何在 C 中写入文件和打印之间切换

问题描述

描述

我正在尝试在 C 中制作一个在终端中工作的基本应用程序。我的目标是编写一个代码,用 dup2(foo, STDOUT_FILENO); 在文件中打印一些输出。一些输出到终端。问题是我无法理解如何在其中两个之间切换。我读了几个问题,但我无法理解。

错误/问题

当我用 C 写

  int foo = open("./foo.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
  dup2(foo, STDOUT_FILENO);
  sytem("man man"); //trying yo write man in foo.txt
  some_macig_function();
  printf("welcome back to terminal output");

我不知道什么是 macig_fonciton,即使我的子进程已完成,我的代码也会继续写入文件(我猜),第二个也是最后一个问题是我的 foo.txt 错误,有类似 (MMAANNUUAALL SSEECCTTIIONNSS) 的输出

标签: clinuxsystem

解决方案


如何在两个之间切换

使用临时文件描述符来存储标准输出。

在 bash 中你可以练习它:

exec {tempfd}<&1       # copy stdout to temporary fd
exec 1>./foo.txt       # redirect to file
man man
exec 1>&${tempfd}      # restore stdout
echo welcome back to terminal output

C中类似:

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main(void) {
    int tempfd = dup(STDOUT_FILENO);      // exec {tempfd}<&1
    int filefd = open("./foo.txt", O_WRONLY | O_CREAT | O_TRUNC);
    dup2(filefd, STDOUT_FILENO);             // exec 1>./foo.txt
    system("echo man man");
    dup2(tempfd, STDOUT_FILENO);          // exec 1>&${tempfd}
    printf("welcome back to terminal output\n");

    system("echo ---- THIS IS IN foo.txt file: ---");
    system("cat foo.txt");

    return 0;
}

repl 上的输出

welcome back to terminal output
---- THIS IS IN foo.txt file: ---
man man

最后一个问题是我的 foo.txt 错误,有类似 (MMAANNUUAALL SSEECCTTIIONNSS) 的输出

将手册页输出重定向到文件会导致单词中出现双字母

我对两者都很陌生

编译所有可能的警告-Wall -Wextra。使用消毒剂检查您的程序并检查-fsanitize=addressvalgrind正确性。


推荐阅读