Как перенаправить stderr изнутри процесса в Rust? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь перенаправить файловый дескриптор Stderr изнутри процесса, но, похоже, его реализации нет, и я не вижу четкого пути к чему-то похожему на dup2 из C / C ++.

Я пытался:

  • , непосредственно реализующий Read (impl Read for Stderr), но для его покрытия потребовалась бы целая библиотека кода.
  • использование данных в дескрипторе файла, затем в File, затем в ReadBuf

    trait FDReader {
        fn consume(&mut self);
    }
    
    impl FDReader for Stderr {
        fn consume(&mut self) {
            let f = std::fs::File::from_raw_fd(self.as_raw_fd());
            let mut extract = String::new();
            BufReader::new(f).read_to_string(&mut extract);
        }
    }
    

    Я сосредоточился на consume из-за того, что мне не нужно было ничего точно возвращатькогда я тестировал свой код, хотя это не сработало.

  • , поскольку я работаю в системе Linux и не планирую публиковать код, я также подумалперенаправить /proc/self/fd/2 -> /dev/null, а затем вернуть исходную ссылку на указатель, когда я хотел написать туда.Это было слишком для этой области.

Я также думал об использовании libc::dup2 напрямую - хотя я устал от этого.

1 Ответ

0 голосов
/ 30 января 2019

Нет способа сделать это в стандартной библиотеке 1 . gag crate позволяет перенаправлять stderr или stdout либо в файл, либо в ничто, но он работает только на * nix системах.

С другой стороны, я бы рекомендовал вам вообще не использовать stdout или stderr .Вместо этого используйте внедрение зависимостей для передачи значений, в которые можно записать.Вместо использования println используйте writeln.

См. Также:


1 Это не строго правда.Вы когда-нибудь замечали, что stdout и stderr не выводятся во время тестов ?Это потому, что компилятор (и набор тестов) используют пару нестабильных, скрытых функций , которые позволяют изменять локальные для потока экземпляры stdout и stderr.

См. Также:

...