Я работаю над системой, которая взаимодействует с дочерними процессами, используя каналы для stdin и stdout. Дочерние процессы используют библиотеку api для облегчения этого взаимодействия, и мне нужно написать модульные тесты для библиотеки. Единственный способ выяснить, как правильно протестировать эти функции, - это заменить stdin / stdout каналами, чтобы тесты могли выдавать себя за родительскую систему при вызове функций.
/* replace stdin and stdout with pipes */
void setup(void) {
pipe(in_sub);
pipe(out_sub);
dup2(out_sub[1], fileno(stdout));
dup2( in_sub[0], fileno(stdin));
read_from = fdopen(out_sub[0], "rb");
write_to = fdopen( in_sub[1], "wb");
stdout_t = fopen("/dev/tty", "wb");
stdin_t = fopen("/dev/tty", "rb");
}
/* reopen stdin and stdout for future test suites */
void teardown(void) {
fclose(read_from);
fclose(write_to);
stdout = stdout_t;
stdin = stdin_t;
close(in_sub[0]);
close(in_sub[1]);
close(out_sub[0]);
close(out_sub[1]);
}
Я попытался просто сохранить stdin и stdout в temps и использование для них fdopen () (должно работать, потому что это ФАЙЛ *), но это не приводит к тому, что вещи правильно записываются в канал. Этот код отлично работает при запуске непосредственно из оболочки хоста. Проблема возникает при запуске по ssh. Модульные тесты выполняются безупречно, но когда я иду писать что-нибудь в stdout после этого набора тестов, я получаю ошибку о сломанном конвейере.
Что я могу сделать, чтобы избежать использования dup2, чтобы stdin и stdout никогда не закрывались, или как Могу ли я повторно открыть stdin и stdout, чтобы они правильно работали в оболочке и по ssh?