5

既存の Windows コードを Linux に移植しています。ACE を抽象化レイヤーとして使用しています。複数のクライアントと通信し、重複した操作を実行するためにパイプという名前のウィンドウを使用しています。

Linuxでこれに相当するものは何ですか。Linux の名前付きパイプ (FIFO) を確認しましたが、それらは 1 つのクライアントとサーバーのみをサポートしているようで、オーバーラップ IO はサポートしていません。

これについて私を案内してもらえますか。

4

3 に答える 3

5

Unix ソケット。本質的に、

  1. コールしsocket(PF_UNIX, SOCK_STREAM, 0)ます。これはファイル記述子を返すか、エラーの場合は -1 を返します。
  2. のようなものを使用struct sockaddr_un addr; bzero(addr); addr.sun_len = sizeof(addr); addr.sun_family = PF_UNIX; strncpy(addr.sun_path, "/path/to/file", sizeof(addr.sun_path)-1);して、ソケット アドレスを作成します。
  3. コールしbind(fd, &addr, sizeof(addr))ます。
  4. listen(fd,backlog)接続をリッスンするために呼び出します。backlog存在できる un-accept() された接続の数です。
  5. クライアントからの接続を受け入れるには、accept() を使用します。これは、新しい FD またはエラーの場合は -1 を返します。
  6. クライアントに同様のソケットを作成させ、そのアドレスに connect() します (バインドする必要はないと思います)。
  7. 完了したら、ファイル /path/to/file を削除します (後で再利用する場合はそのままにしておきます)。

SOCK_DGRAM が Unix ソケットでサポートされているかどうかはわかりません (サポートされている場合、おそらく UDP に似ています)。

socket(2)、bind(2)、listen(2)、accept(2)、connect(2)、unix(4)、setsockopt(2) のマニュアル ページを参照してください。

「重複した I/O」については、select(2) を参照してください。さらに、ノンブロッキング IO を有効にすることができますfcntl(fd,F_SETFL,(int)(fcntl(fd,F_GETFL)|O_NONBLOCK))(fcntl(2) を参照)。これは、read() と write() がブロックされないことを意味します (つまり、write() は short を返す可能性があるため、戻り値を確認する必要があります)。

Windows の名前付きパイプが複数のクライアントからの複数の接続をどのように表しているかはよくわかりませんが、UNIX では、接続ごとに 1 つのファイル記述子 (および「リッスン」ソケット用に 1 つ) を取得します。

于 2010-08-19T17:19:51.110 に答える
0

私が思い出すと、彼らはfork()とstdin/stdoutおよび/またはsocketsを実行すると思います。私はPythonでそれを行いましたが、それは素晴らしい非常に高レベルのIPCラッパーを持っているので、*nixでどのように正確に機能するかわかりません。

私がかなり確信しているのは、少なくともWindowsに存在するような、重複したI/Oのようなものはないということです。ロッキングプリミティブもWindowsに比べてやや悪いですが、ソケットのものはより適切に動作する傾向があります。

それで、そのfork()周りのIPC関連のものを調べてください。あなたも良いリファレンスに投資したいかもしれません。この本はWindowsのハートの本に相当すると思います。

于 2010-08-19T16:56:46.623 に答える
0

通信がローカルの場合は、UNIX ドメイン ソケットまたは TCP ソケットを使用します。Unix ドメイン ソケットは、呼び出しプロセスの資格情報を受け取ることができます。

ネットワーク上にある場合は、TCP ソケットを使用します。

Windows の名前付きパイプの一部の機能はサポートされていないことに注意してください。TCP ソケットを介して資格情報を渡すことはできないため、プロトコルを必要としないようにプロトコルを設計する必要があります。

于 2010-08-19T18:36:47.087 に答える