2017-03-17 14 views
0

子をフォークして親の出口を作ることで、C++ gRPCサーバーをデーモンプロセスにしようとしています。しかしその後、クライアントハンドシェイクが失敗し始めます。フォークを呼び出した後、gRPCサーバーでSSLハンドシェイクが失敗する

E0307 01:15:58.221786152 27094 handshake.c:128] Security handshake failed: 
{"created":"@1488878158.221756436","description":"Handshake read failed", 
"file":"src/core/lib/security/transport/handshake.c", 
"file_line":237,"referenced_errors": 
[{"created":"@1488878158.221740996","description":"FD shutdown", 
"file":"src/core/lib/iomgr/ev_epoll_linux.c","file_line":948}]} 

fork()BuildAndStart()への呼び出しの後に呼び出されたときに発生します。 BuildAndStart()の前に同じフォークが実行されていれば、すべて正常に動作します。 私は基礎となるSSLの実装と、gRPCサーバーがキーと証明書でどのように動作するかは知らない。

答えて

0

接続に対応するファイルの説明がシャットダウンされているため、SSLハンドシェイクが失敗します。 FDが最初にシャットダウンされるのは、フォークの後で、親と子の両方がカーネルのファイル記述子構造体を共有しているからです。したがって、アクセスを同期させるために十分な注意を払わなければ、データ競争が起こります。

可能であれば、先にフォークしてみてください。そうでなければ、それは親子がポストフォークを何をするかに依存します。

+0

フォークは早く動作します。これにより、子がポートでリスンを開始する前に、親を終了させることができます。クライアントは、まだ準備ができていないサーバーとの接続を確立しようとする可能性があります。私はそれを避けようとしていました。しかし、パイプを使用して親が子が準備ができていることを示すのを待つことで、この問題を克服することができます。 – damleak

+0

いいですね。親と子を同期させる必要が常にあり、パイプは1つの方法です。 –

関連する問題