簡體   English   中英

C ++:fork / exec還是pthread?

[英]C++ : fork/exec or pthread?

我正在編寫一個程序,一旦按下按鈕,我就必須執行一個服務器進程(只有在我決定殺死他時才會停止)。
為了執行這個過程,我決定使用fork / execv機制:

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

在方法“按下按鈕”,我做:

command->RunServer();

它似乎在幾天前工作得很好......現在我得到錯誤:

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

我應該嘗試切換到pthread嗎? 我做了壞事嗎?

謝謝,
EO

當你執行fork() ,進程的所有文件描述符都會在新的文件描述符中重復。 當你執行exec*()所有文件描述符也會被保留,除非它們標有FD_CLOEXEC標志。

我的猜測是某些庫使用的某些fd(可能是Xlib)是由新進程繼承的,並且復制會導致程序混亂。

在這些情況下,如果要保持標准I / O打開,則BSD函數closefrom()closefrom(3) )非常有用。 不幸的是,在linux中沒有這樣的功能,所以你必須做一個close-all循環或類似的cruft:

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

您可以在此處詳細了解此問題。

在對execvargv必須由空指針終止。 上一行應該是:

char* argv[] = { "./Server", str, NULL };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM