[zeromq-dev] Messages lost on fork()

Pete Hayes pete at hayes.id.au
Mon Jan 13 14:31:54 CET 2014

Hi all,

Apologies if this is a dumb question, but I am struggling to understand what’s going on here: I have a small REQ -> ROUTER script that forks, sends a message to the ROUTER and then exits. If I create all of the REQ sockets before the ROUTER socket it works fine, but if I do it the other way it doesn’t work.

To exemplify what I’m talking about, the below script first forks to create a REQ socket and then creates the ROUTER socket. The REQ socket sends “Send 0” to the ROUTER which is received correctly. Then the script forks again and attempts to send a new message via a REQ socket as before, but this message does not get through. FYI I’ve tried changing to TCP sockets too, in case IPC sockets didn’t like the order with which I connected them.

It appears to be something to do with forking process that throws it. If I remove the second create() fn call and instead create a new socket under the current context, it works fine. Thus Fork+REQ => ROUTER works, ROUTER => REQ works, but ROUTER => Fork+REQ does not. Hopefully that makes sense??

I’d really appreciate some help from the ZMQ boffins out there!




My environment is: FreeBSD 9.2, PHP 5.5.7, ZeroMQ 4 (latest code from GitHub stable repo), PHP ZMQ binding (latest code from GitHub).

My output looks like this:

Create worker 1
Send 1
Create worker 2

The script I’m running from shell:

function create($id) {
    if (pcntl_fork() == 0) {
        echo "Create worker $id\n";

        $context = new ZMQContext();
        $worker = $context->getSocket(ZMQ::SOCKET_REQ);
        $worker->send("Send $id");


$id = 0;

$context = new ZMQContext();
$backend = new ZMQSocket($context, ZMQ::SOCKET_ROUTER);

while (true) {
    echo $backend->recv() . "\n";

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20140113/ae37e231/attachment.htm>

More information about the zeromq-dev mailing list