1

这看起来看似简单,但伴随着许多令人讨厌的细节和兼容性问题。我有一些在 Linux 上运行的代码,并且在 Windows 上运行,但它有各种问题,这似乎是一个常见而简单的问题。我知道异步现在风靡一时,但我有充分的理由希望每个连接都有一个进程。

我正在编写一个托管模拟过程的服务器。因此,每个连接都是长时间运行且 CPU 密集型的。但更重要的是,这些模拟器(Ngspice、Xyce)具有全局状态,有时会出现段错误或达到不可恢复的错误。因此,每个连接都必须有自己的进程,这样它们就可以并行运行/崩溃,而不会弄乱彼此的状态。

另一个半重要的细节是该协议基于 Capnp RPC,它有一个很好的跨平台异步 API,但不是阻塞的。所以我要做的是拥有自己的阻塞接受循环,它分叉一个新进程,然后在新进程中启动 Capnp 事件循环。

所以我从一个简单的接受循环开始,添加了大量的 ifdef 来支持 windows,然后添加了 fork 使其成为多进程,然后添加了一个 SIGCHLD 处理程序来避免僵尸进程。但是 Windows 没有分叉,如果许多客户端同时断开连接,我仍然会遇到僵尸。

我当前的代码在这里:https ://github.com/NyanCAD/SimServer/blob/1ba47205904fe57196498653ece828c572579717/main.cpp

我可以使用更多 ifdefs 和 hack 来使 Windows 工作并避免僵尸,或者使用某种库来提供现成的多进程套接字服务器或编写这样的东西的功能。重要的部分是它可以接受新进程中的套接字并将原始 FD 传递给 Capnp 事件循环。

4

0 回答 0