Замена, а затем открытие stdin / stdout через ssh

Я работаю над системой, которая взаимодействует с дочерними процессами, используя каналы для 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?

5
задан Alex Norton 5 August 2011 в 19:02
поделиться