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;
    }