私はアプリケーションからboostを削除しています(pre C++ 11を使用しているためにboostを取り除きたいからです)。そして同じものの一部として次の問題を実行しました。SIGINFOのSIGINFO構造体のsockfd
私は、ブースト(async_connect、async_writeおよびasync_read呼び出し)を使用して、リモートサーバーからデータを非同期に接続し、要求し、受信するコードを用意しています。私は非同期モードで動作するlinuxネイティブソケットと同じものを置き換える予定です。
私は見て始めました ioctl(_sockfd、FIOASYNC、&); ソケットを非同期モードに設定します。 次も設定します fcntl(_sockfd、F_SETOWN、getpid()); ソケットを作成するプロセスに向けられたすべてのsockfd関連シグナルを取得します。 SIGIO信号を処理すると、さまざまな信号関連情報を含むsiginfo_t構造体にアクセスできます。
しかし、受信したsiginfo構造体インスタンスからsockfdを取得することができません。これにより、sockfd; sigioシグナルが捕捉されにくくなります。 si-> si_fdは、connectが呼び出された_sockfdと一致しません。 SIGIOのSIGINFOのfdが、この信号が生成されたsockfdと一致しないのはなぜですか。 siginfoの内容も信頼できますか? socket(7)
manページから
シグナルAPIを無視し、select()やpoll()を使ってソケット処理を実装することをお勧めします。シグナルはマルチスレッドやオブジェクト指向設計ではうまく動作せず、非同期ソケットが必要で、 C++には両方が必要になる大きなチャンスがあります。 – gabry
sigaction()を使ってシグナルハンドラを確立するときに 'SA_SIGINFO'を設定しましたか?下記も参照してくださいhttps://stackoverflow.com/questions/19866754/sigio-arriving-for-file-descriptors-i-did-not-set-it-for-and-when-no-io-is-possi – nos