私はstdin、stdout、stderrをソケット経由でリダイレクトしたいと思っています。dup2と同等のC言語のWindowsソケット
このコードはLinux上で動作します:
dup2(socket, 0);
dup2(socket, 1);
dup2(socket, 2);
ではなく、Windows上のソケットはディスクリプタではありませんので。
Windowsでこれを行うにはどうすればよいですか?
私はstdin、stdout、stderrをソケット経由でリダイレクトしたいと思っています。dup2と同等のC言語のWindowsソケット
このコードはLinux上で動作します:
dup2(socket, 0);
dup2(socket, 1);
dup2(socket, 2);
ではなく、Windows上のソケットはディスクリプタではありませんので。
Windowsでこれを行うにはどうすればよいですか?
Windowsでは、ソケットAPIの戻り値はSOCKET
です。これはファイル記述子ではありません(または、必ずしも小さな負の整数ではありません)。ただし、いくつかの方法でファイルハンドルとして使用することができます。according to MSDN特に、ReadFile()
とWriteFile()
で使用できます。
MSライブラリ関数_open_osfhandle()
を使用して、OSレベルのファイルハンドルをCスタイルのファイル記述子に変換できます。これは通常のファイルで動作しますが、SOCKET
で動作する場合と動作しない場合があります。そのファイル記述子を取得したら、それを_dup2()
に渡し、_fileno(stderr)
を第2引数として渡すことができます。このディスクリプタは必ず_close()
で終了し、元のハンドルも閉じます。
「うまくいきません」とは、問題の説明ではありません。 [ask]を読んで、助言に従って[mcve]を提供してください。 – Olaf
@Olaf動作しなければならない理由がないので動作しません。私は、「Windows上で同等の機能は何ですか?」という意味ではなく、「これを試して問題を発見した」ということです。 – immibis
@immibis:必要な情報がなければ、どうすればわかりますか?私は、誰かが何を考えているかを知るために透き通っているわけではありません。 – Olaf