descriptores archivos c++ unix pipe stderr dup2

c++ - archivos - Redirigir FROM stderr a otro descriptor de archivo



stdout java (2)

Mi programa llama a las funciones de la biblioteca que imprimen en stderr. Quiero intervenir para que todas las llamadas de escritura al descriptor de archivo n. ° 2 sean enviadas a otro lugar.

Aqui esta mi primer intento:

bool redirect_stderr (int fd) { return dup2 (2, fd) > 0; }

Aquí, fd se obtuvo con éxito desde open("/foo/bar",O_APPEND|O_CREAT)

Después de que esta función devuelve verdadero, std::cerr<<"blah" va al terminal y no al archivo.

¿Qué estoy haciendo mal?

Gracias.

ACTUALIZAR

Gracias, Larsmans, pero todavía no estoy allí ...

void redirect_stderr_to (const char * output_file) { int fd = open (output_file, O_APPEND | O_CREAT, S_IRUSR | S_IWUSR); if (fd < 0) { throw RUNTIME_ERROR; } else { if (-1 == dup2 (fd, STDERR_FILENO)) throw RUNTIME_ERROR; std :: cout << (std::cerr ? "Fine/n" : "Bad/n"); char x [100]; std :: cerr << "Output to " << getcwd (x, 100) << " / " << output_file << " yields " << fd << " errno: " << errno << "/n"; std :: cout << (std::cerr ? "Fine/n" : "Bad/n"); } }

Estas salidas

Fine Bad

a stdout y el archivo dado está vacío. (Se crea correctamente si no existe).


Invertiste los argumentos: es

dup2(from_fd, to_fd)

es decir

dup2(fd, 2)

(vea POSIX.2008 o sus páginas de manual).


Solo para completar: incluso podría alcanzar su objetivo con freopen(name, mode, stderr) , que es una función estándar / ANSI / ISO C89 y C99.