使用 dup2 撤消标准输出的重定向
Undo redirect of stdout with dup2
下面的代码将"A"和"B"写入文件"out.txt,第一次调用打开返回3,第二次调用返回4。
我期望的是将"A"写入文件,将"B"写入屏幕。我还期望在每种情况下打开返回 3
。我应该怎么做才能修复下面的代码:
int main(int argc, char** argv)
{
int file = open("out.txt", O_APPEND | O_WRONLY);
if(file != 3) return 1;
if(dup2(file,1) < 0) return 1;
std::cout << "A" << std::endl;
if(dup2(1,file) < 0) return 1;
std::cout << "B" << std::endl;
file = open("out.txt", O_APPEND | O_WRONLY);
if(file != 3) return 1;
return 0;
}
从此链接发表评论;
if(dup2(file,1) < 0) return 1;
使newfd成为oldfd的副本,必要时首先关闭newfd'
也就是说,它关闭 stdout 并使文件描述符 1 成为文件描述符 3 的克隆。
if(dup2(1,file) < 0) return 1;
如果 oldfd 是一个有效的文件描述符,并且 newfd 与 oldfd 具有相同的值,则 dup2() 不执行任何操作,并返回 newfd。
因此,它不执行任何操作,因为文件描述符 1 与文件描述符 3 具有相同的值。
file = open("out.txt", O_APPEND | O_WRONLY);
将使用下一个可用的文件描述符打开文件。由于文件描述符 3 很忙,它将(在本例中)使用 4。
你想做的是更多的事情;
int stdoutCopy = dup(1); // Clone stdout to a new descriptor
if(dup2(file, 1) < 0) return 1; // Change stdout to file
close(file); // stdout is still valid
std::cout << "A" << std::endl;
if(dup2(stdoutCopy,1) < 0) return 1; // Change stdout back from the clone
close(stdoutCopy); // Close the clone
std::cout << "B" << std::endl;
相关文章:
- 使用重定向标准处理子进程中的 kbhit
- 无法使用创建进程重定向标准输出
- 重定向标准输出时调用 dup2 失败
- 如何在 C++ 中的不同函数中实现重定向标准输入
- C++ 无限循环读取文件创建重定向命令输出
- 如何在C++中重定向断言输出
- 在 cpp 中重定向标准输出
- 从 C++ 中的另一个程序重定向标准输出
- 无法使用重定向标准输出调用 g++
- 从通过MPI_Comm_spawn生成的儿童重定向标准输出
- 如何在一行中将输入流重定向到输出流
- Unix上的C++:重定向Shell输出
- 如何重定向标准输出,因为它来自流
- 重定向函数输出到/dev/null
- 重定向标准输出到LCD:成员类的指针
- 重定向标准输出到文件不工作
- 重定向程序输出作为输入管道不工作
- 在c++ /CLI中,是否有比system()更好的方法来重定向标准输出?
- 在c# GUI项目上重定向标准输出+标准错误
- 重定向标准I/O: freopen + stdin/stdout vs open + dup2