public static Socket fork(ZContext ctx, IAttachedRunnable runnable, Object... args) {
        Socket pipe = ctx.createSocket(ZMQ.PAIR);

        if (pipe != null) {
            pipe.bind(String.format("inproc://zctx-pipe-%d", pipe.hashCode()));
        } else {
            return null;
        }

        // Connect child pipe to our pipe
        ZContext ccontext = ZContext.shadow(ctx);
        Socket cpipe = ccontext.createSocket(ZMQ.PAIR);
        if (cpipe == null)
            return null;
        cpipe.connect(String.format("inproc://zctx-pipe-%d", pipe.hashCode()));

        // Prepare child thread
        Thread shim = new ShimThread(ccontext, runnable, args, cpipe);
        shim.start();

        return pipe;
    }