c - 如何在 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) 的输出
解决方案
如何在两个之间切换
使用临时文件描述符来存储标准输出。
在 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;
}
welcome back to terminal output
---- THIS IS IN foo.txt file: ---
man man
最后一个问题是我的 foo.txt 错误,有类似 (MMAANNUUAALL SSEECCTTIIONNSS) 的输出
我对两者都很陌生
编译所有可能的警告-Wall -Wextra
。使用消毒剂检查您的程序并检查-fsanitize=address
其valgrind
正确性。
推荐阅读
- javascript - 如何从给定的 JSON 数据格式制作 Javascript 对象
- mongoose - 使用 findOneAndUpdate 和 $inc 只执行一次操作
- arrays - C中二维数组中特定列的总和
- neo4j - 在“云图集”的 2 跳范围内寻找电影和演员
- android - AdblockWebView 仍在显示广告
- ethereum - 代币(solidity)- 用户支付 gas 后,从主应用程序钱包中奖励用户 X 数量的代币
- python - 无法使用 pandas_datareader 访问 Yahoo 财务数据
- node.js - 当我尝试创建新用户时,发布请求不起作用
- python - 没有观察值的绘图条
- mysql - Unicenta POS 无法连接到 Debian 11 上的 mysql 5.7