Những gì tôi muốn làmchuyển hướng stdout/stderr nộp theo unix C++ - một lần nữa
chuyển hướng stdout và stderr đến một hoặc nhiều tập tin từ bên trong C++
Tại sao tôi cần nó
Tôi đang sử dụng thư viện bên thứ ba được biên dịch sẵn bên ngoài, tạo ra một lượng đầu ra vô lý, mà tôi muốn chuyển hướng đến tệp nhật ký để giữ cho bàn điều khiển luôn sạch sẽ.
Điều kiện
Compatibility không phải là một vấn đề, mã sẽ chỉ chạy trên các hệ thống Unix. Chuyển hướng không chỉ ảnh hưởng đến in ấn C++ - style (std :: cout < < "hello world" < < std :: endl), mà còn in c-style (printf ("hello world \ n")).
Những gì tôi đã cố gắng cho đến nay
Tôi đã được duyệt trên stackoverflow cho nửa ngày, đọc nhiều câu trả lời cho những người gặp vấn đề tương tự. Với sự giúp đỡ của những câu trả lời, tôi đã có thể cùng nhau đưa các đoạn mã sau:
#include <stdio.h>
#include <iostream>
#include <fcntl.h>
#include "unistd.h"
const int stdoutfd(dup(fileno(stdout)));
int redirect_stdout(const char* fname){
fflush(stdout);
int newstdout = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(newstdout, fileno(stdout));
close(newstdout);
}
int restore_stdout(){
fflush(stdout);
dup2(stdoutfd, fileno(stdout));
close(stdoutfd);
return stdoutfd;
}
int main(){
redirect_stdout("/dev/null");
std::cout << "invisible 1" << std::endl;
restore_stdout();
std::cout << "visible 1" << std::endl;
redirect_stdout("/dev/null");
std::cout << "invisible 2" << std::endl;
restore_stdout();
std::cout << "visible 2" << std::endl;
return 0;
}
Những gì tôi mong chờ để xem:
visible 1
visible 2
Những gì tôi thực sự xem
visible 1
Tức là, khi sử dụng cơ chế cho lần đầu tiên, nó hoạt động - nhưng nếu được sử dụng một lần nữa, khôi phục đầu ra sẽ không hoạt động. Ai đó có thể chỉ ra cho tôi những gì tôi cần thay đổi để có cơ chế hoạt động vô hạn?
có thể trùng lặp: http://stackoverflow.com/questions/4810516/c-redirecting-stdout – Kelm