Linuxにアプリケーションがあり、正常にコンパイルされています。同じプログラムをWindowsで実行したい。
ただし、コンパイルにより、ヘッダーファイルに関連する次のエラーが発生します。
どうすればこれを修正できますか?
Windows APIは、構造的およびスタイル的に、Unixのあらゆるフレーバーによって提供されるシステムコールとライブラリルーチンのブレンドとは大きく異なります。
Windowsは、他の* nixシステムとは非常に異なるモデルで端末I/Oを実行します。結果として、_termios.h
_ヘッダーとその仲間に直接相当するものは実際にはありません。
あなたはWindowsについてMSDNで読みたいです コミュニケーションリソース 。
詳細については、次のとおりです。
BuildCommDCB()
SetCommState()
一般に、stdio
はデバイスのI/Oを実行するときに混乱を招くため、WindowsAPIを直接処理する必要があることがわかります。
Unix select(2)システムコールに直接相当するものはありません。
Windowsでは、多くのカーネルオブジェクトがシグナル状態または非シグナル状態のいずれかになり、オブジェクトにシグナルを送る動作を使用して、 WaitForMultipleObjects()
と呼ばれるスレッドを解放できます。すべてではありませんが、一部のHANDLE
オブジェクトは、データが利用可能になると通知されます。具体的には、WinSockのHANDLE
sにその機能があることは知っていますが、CommAPIについては知りません。開いているファイルへのHANDLE
sはそうではないことを私は知っています。
ウィンドウメッセージを処理しているスレッドでイベントを待機する必要がある場合は、代わりに MsgWaitForMultipleObjects()
を使用する必要があります。スレッドがブロックされている間はメッセージが適切に配信されるためです。 。
Windows同期プリミティブについては、MSDNの記事 同期の使用 を参照してください。
ただし、Windowsに組み込まれている非同期I/Oにはいくつかの種類があり、設計の変更によってselect()
の必要性を置き換えることができます。どちらも、Cstdioライブラリと組み合わせて使用できない機能を広範囲に使用する必要があります。
MSDNには、I/O手法に関するいくつかの記事と、多数の例があります。
CreateFile()
(特に備考セクション)Windowsの動作に関する情報の多くは、API関数と構造のリファレンス資料の概要記事と備考セクションに散在していることに注意してください。これは、最初の読み取りで完全に文書化されたものは何もないという印象を与える可能性があります。
別のアプローチは、 Cygwin を使用して移植を行うことです。これは、WindowsAPI上にほとんどのPOSIXレイヤーを提供します。ただし、Cygwin DLL)に依存するアプリケーションが作成されます。これは、商用利用ライセンスを購入しない限り、GPLです。Cygwinを使用して次のようなアプリケーションを取得するのは難しい場合があります。 2つのシステムのセットアップ方法と使用方法に関する他の多くの仮定が異なるため、Unixの経験がないWindowsユーザーにも適しています。
Cygwinは、さまざまなオープンファイル記述子が混在している場合にWindowsで機能するselect()
の実装を構築するために、かなりの労力を費やしました。この取り組みは ユーザーガイドに記載されています です。
Cygwinに対するビルドは、Cygwin環境内から実行された場合にのみ文書化およびサポートされることに注意してください。通常、CygwinのビンをWindows PATHに配置して、コマンドプロンプトから作業するだけでは不十分です。 Cygwinのbashビルドを起動し、そこからコンパイルして、すべてが同じCygwinスタイルのマウントポイントとシミュレートされたUnixファイル構造を使用するようにする必要があります。
Cygwinヘッダーファイルをサードパーティのツールヘッダーファイルと混合することは、狂気への確実な道です。
編集:少し並べ替えて、コメントに応じて資料を追加しました。