Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ : fork/exec or pthread?

I'm writing a program, and once a button is pushed, I have to execute a server process (that will stop only if I decide to kill him).
To execute this process, I decided to use fork/execv mechanism :

void Command::RunServer() {

    pid = fork();

    if (pid==0) {
        chdir("./bin");
        char str[10];
        sprintf(str,"%d",port);
        char *argv[] = {"./Server", str};
        execv("./Server",argv);
    }
    else {
        config->pid = pid;
        return;
    }
}

And in the method "button pushed", I do:

command->RunServer();

It seemed to work nicely a few days ago... and now i get error :

main: xcb_io.c:221: poll_for_event: Assertion `(((long) (event_sequence) - (long) (dpy->request)) <= 0)' failed.

Should I try to switch to pthread? Did I do something bad?

Thanks,
eo

like image 323
eouti Avatar asked Feb 20 '23 19:02

eouti


1 Answers

When you do fork() all file descriptors of your process are duplicated in the new one. And when you do exec*() all file descriptors are also kept, unless they are marked with the flag FD_CLOEXEC.

My guess is that some fd used by some library (Xlib, probably) is inherited by the new process, and that the duplication is causing chaos in your program.

In these cases is useful the BSD function closefrom() (closefrom(3)) if you want to keep the standard I/O opened. Unfortunately, in linux there is no such function, so you have to do a close-all loop or similar cruft:

int open_max = sysconf (_SC_OPEN_MAX);
for (int i = 3; i < open_max; i++)
    close(i);

You can read more about this problem here.

like image 113
rodrigo Avatar answered Mar 03 '23 09:03

rodrigo