2017-03-17 174 views
0

我正在嘗試使C++ gRPC服務器成爲一個守護進程,方法是分支一個子進程並讓其父進程退出。但之後,客戶端握手開始失敗。調用fork後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首先被關閉的原因可能是由於這樣一個事實:在fork之後,父級和子級共享內核中的文件描述符結構。因此,除非非常在意運動來同步訪問權限,否則您將進行數據競賽。

如果可能,請儘早嘗試分叉。否則,這一切都取決於父母和孩子做什麼後分叉。

+0

分岔早期工作正常。這允許父母在孩子開始在端口上收聽之前退出。客戶端可能會嘗試與尚未準備好的服務器建立連接。我試圖避免這種情況。但是,可以通過使用管道讓父母等待孩子指示何時準備好,從而解決問題。 – damleak

+0

聽起來不錯。總是需要同步父母和孩子,而管道是一種方式。 –