stdinとstdoutへのパイプを使って子プロセスと通信するシステムで作業しています。子プロセスはこの通信を容易にするためにapiライブラリを使用し、ライブラリの単体テストを書く必要があります。これらの関数を適切にテストする方法を理解する唯一の方法は、stdin/stdoutをパイプで置き換えて、関数を呼び出すときにテストが親システムのふりをすることができるようにすることです。stdin/stdoutをsshに置き換えて開く
/* 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]);
}
私は(彼らはFILEの*であるため、動作するはずです)その上)(ちょうどタンで標準入出力を保存してのfdopenを使用して試してみましたが、これは正しくパイプに書き込まれているものにはなりません。このコードは、ホストのシェルから直接実行されたときに完全に機能します。この問題は、sshで実行しているときに発生します。ユニットテストは完全に実行されますが、このテストスイートの後にstdoutに何かを書き込むと、パイプエラーが発生します。
stdinとstdoutが決して閉じられないようにするためにdup2を使用しないようにするにはどうすればよいでしょうか、またはstdinとstdoutをシェルやsshで正しく動作させる方法を教えてください。