调用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之后,父级和子级共享内核中的文件描述符结构。因此,除非非常在意运动来同步访问权限,否则您将进行数据竞赛。
如果可能,请尽早尝试分叉。否则,这一切都取决于父母和孩子做什么后分叉。
分岔早期工作正常。这允许父母在孩子开始在端口上收听之前退出。客户端可能会尝试与尚未准备好的服务器建立连接。我试图避免这种情况。但是,可以通过使用管道让父母等待孩子指示何时准备好,从而解决问题。 – damleak
听起来不错。总是需要同步父母和孩子,而管道是一种方式。 –