web-dev-qa-db-ja.com

sys /select.hおよびtermios.hで定義されている機能に相当するWindowsは何ですか

Linuxにアプリケーションがあり、正常にコンパイルされています。同じプログラムをWindowsで実行したい。

ただし、コンパイルにより、ヘッダーファイルに関連する次のエラーが発生します。

  1. Sys /select.hが見つかりません
  2. Termios.hが見つかりません

どうすればこれを修正できますか?

19
Renjith G

Windows APIは、構造的およびスタイル的に、Unixのあらゆるフレーバーによって提供されるシステムコールとライブラリルーチンのブレンドとは大きく異なります。

termio.h

Windowsは、他の* nixシステムとは非常に異なるモデルで端末I/Oを実行します。結果として、_termios.h_ヘッダーとその仲間に直接相当するものは実際にはありません。

あなたはWindowsについてMSDNで読みたいです コミュニケーションリソース

詳細については、次のとおりです。

一般に、stdioはデバイスのI/Oを実行するときに混乱を招くため、WindowsAPIを直接処理する必要があることがわかります。

select.h

Unix select(2)システムコールに直接相当するものはありません。

Windowsでは、多くのカーネルオブジェクトがシグナル状態または非シグナル状態のいずれかになり、オブジェクトにシグナルを送る動作を使用して、 WaitForMultipleObjects() と呼ばれるスレッドを解放できます。すべてではありませんが、一部のHANDLEオブジェクトは、データが利用可能になると通知されます。具体的には、WinSockのHANDLEsにその機能があることは知っていますが、CommAPIについては知りません。開いているファイルへのHANDLEsはそうではないことを私は知っています。

ウィンドウメッセージを処理しているスレッドでイベントを待機する必要がある場合は、代わりに MsgWaitForMultipleObjects() を使用する必要があります。スレッドがブロックされている間はメッセージが適切に配信されるためです。 。

Windows同期プリミティブについては、MSDNの記事 同期の使用 を参照してください。

ただし、Windowsに組み込まれている非同期I/Oにはいくつかの種類があり、設計の変更によってselect()の必要性を置き換えることができます。どちらも、Cstdioライブラリと組み合わせて使用​​できない機能を広範囲に使用する必要があります。

MSDNには、I/O手法に関するいくつかの記事と、多数の例があります。

Windowsの動作に関する情報の多くは、API関数と構造のリファレンス資料の概要記事と備考セクションに散在していることに注意してください。これは、最初の読み取りで完全に文書化されたものは何もないという印象を与える可能性があります。

Cygwinでの移植

別のアプローチは、 Cygwin を使用して移植を行うことです。これは、WindowsAPI上にほとんどのPOSIXレイヤーを提供します。ただし、Cygwin DLL)に依存するアプリケーションが作成されます。これは、商用利用ライセンスを購入しない限り、GPLです。Cygwinを使用して次のようなアプリケーションを取得するのは難しい場合があります。 2つのシステムのセットアップ方法と使用方法に関する他の多くの仮定が異なるため、Unixの経験がないWindowsユーザーにも適しています。

Cygwinは、さまざまなオープンファイル記述子が混在している場合にWindowsで機能するselect()の実装を構築するために、かなりの労力を費やしました。この取り組みは ユーザーガイドに記載されています です。

Cygwinに対するビルドは、Cygwin環境内から実行された場合にのみ文書化およびサポートされることに注意してください。通常、CygwinのビンをWindows PATHに配置して、コマンドプロンプトから作業するだけでは不十分です。 Cygwinのbashビルドを起動し、そこからコンパイルして、すべてが同じCygwinスタイルのマウントポイントとシミュレートされたUnixファイル構造を使用するようにする必要があります。

Cygwinヘッダーファイルをサードパーティのツールヘッダーファイルと混合することは、狂気への確実な道です。

編集:少し並べ替えて、コメントに応じて資料を追加しました。

33
RBerteig