ZeroMQとfork(2)ではまった

僕はかなりはまったのですが、ZeroMQのcontextはfork(2)で複製できません。以下のようなコードを書くと死にます。forkする前にcontextを破棄するか、preforkしておく必要があります。

URLを忘れたのですが、MLでもpreforkしておいてよみたいな流れだったので、バグとかではなく、こういうものなのだと思います。

#include <iostream>
#include <stdexcept>
#include <zmq.hpp>
#include <unistd.h>

bool xfork() {
    pid_t const pid = fork();
    if (pid == -1) {
        throw std::runtime_error("fork");
    }
    return pid == 0;
}

int main() {
    zmq::context_t ctx(1);

    if (xfork()) {
         // なんかする
    } else {
        // なんかする
    }
    return 0;
}