调用fork后gRPC服务器中的SSL握手失败

问题描述:

我正在尝试使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服务器如何使用密钥和证书行为一无所知。

与连接对应的文件描述正在关闭,导致SSL握手失败。 FD首先被关闭的原因可能是由于这样一个事实:在fork之后,父级和子级共享内核中的文件描述符结构。因此,除非非常在意运动来同步访问权限,否则您将进行数据竞赛。

如果可能,请尽早尝试分叉。否则,这一切都取决于父母和孩子做什么后分叉。

+0

分岔早期工作正常。这允许父母在孩子开始在端口上收听之前退出。客户端可能会尝试与尚未准备好的服务器建立连接。我试图避免这种情况。但是,可以通过使用管道让父母等待孩子指示何时准备好,从而解决问题。 – damleak

+0

听起来不错。总是需要同步父母和孩子,而管道是一种方式。 –