RejectedSoftware Forums

Sign up

vibe.d and posix fork

Hello.
Please, excuse me my bad english in advance!extern (с) int fork() to daemonize vibe.d REST server on POSIX systems?
This minimal example is not workable:

extern (C) int fork();
int main(string[] args){
    if (fork()) return 0;
    
    void index(HTTPServerRequest req, HTTPServerResponse res){
        res.writeBody("Hello World!");
    }
	
    auto settings = new HTTPServerSettings;
    settings.bindAddresses = ["127.0.0.1"];
    
    auto router = new URLRouter;
    router.get("/", &index);

    listenHTTP(settings, router);
    runEventLoop();

    return 0;
}

I got

core.exception.InvalidMemoryOperationError@(0)
core.exception.InvalidMemoryOperationError@(0)

on runEventLoop()

This example builds with dub "versions": ["VibeCustomMain"]

Re: vibe.d and posix fork

Sorry, some errors on post text parser.
My post begins with:

Please, excuse me my bad english in advance...
May be this is stupid question. But. Is it possible to use extern (с) int fork() to ?daemonize vibe.d REST server on POSIX systems?

Re: vibe.d and posix fork

On 10/06/2014 10:44 AM, Rafael wrote:

Hello.
Please, excuse me my bad english in advance!extern (с) int fork() to daemonize vibe.d REST server on POSIX systems?
This minimal example is not workable:

extern (C) int fork();
int main(string[] args){
     if (fork()) return 0;

     void index(HTTPServerRequest req, HTTPServerResponse res){
         res.writeBody("Hello World!");
     }
	
     auto settings = new HTTPServerSettings;
     settings.bindAddresses = ["127.0.0.1"];

     auto router = new URLRouter;
     router.get("/", &index);

     listenHTTP(settings, router);
     runEventLoop();

     return 0;
}

Works for me.

Re: vibe.d and posix fork

On Mon, 06 Oct 2014 22:01:52 +0200, Martin Nowak wrote:

On 10/06/2014 10:44 AM, Rafael wrote:

Hello.
Please, excuse me my bad english in advance!extern (с) int fork() to daemonize vibe.d REST server on POSIX systems?
This minimal example is not workable:

extern (C) int fork();
int main(string[] args){
     if (fork()) return 0;

     void index(HTTPServerRequest req, HTTPServerResponse res){
         res.writeBody("Hello World!");
     }
	
     auto settings = new HTTPServerSettings;
     settings.bindAddresses = ["127.0.0.1"];

     auto router = new URLRouter;
     router.get("/", &index);

     listenHTTP(settings, router);
     runEventLoop();

     return 0;
}

Works for me.

Yes, it works on linux. But on OSX ( and probably FreeBSD ) it does not work. I think it is libevent (kpoll/kqueue) problem. The child process must call event_reinit() after fork()