簡體   English   中英

如何使用fork()func在C中守護進程。 - 套接字編程

[英]How to daemonize a process in C using fork() func. - socket programming

我已經搜索了很多,並且我知道也許我已經遇到了一些有用的答案,但卻無法理解它們......我的程序員並不多。:)

我希望實現一個守護進程 - 后台進程完全獨立於同時發生的事情 - 解析從服務器接收的數據(我正在編寫IRC客戶端)但是使用select以非阻塞方式進行()。

這是我的代碼片段。 但我無法在評論//其余的程序中獲得printf

我希望它足夠可以理解。

pID=fork();
        if(pID < 0){
            //failed to execute fork()
            perror("Error while forking");
            getchar();getchar();
            exit(1);
        }
        if(pID > 0){
            exit(0);
            }
        //child down here
            umask(0);
            //setting new session
            sID = setpgid(0,0);
            if(sID < 0){
                perror("Error while setting new session");
                getchar();getchar();
                exit(1);
            }
            while(1){
                sleep(1);
                if((readReady = readReadiness(sockfd))==0)
                    continue;
                else{
                    //here am going to recv() data from server
                    printf("I am child and parsing\n"); //testing if its in background -i would like it not to print to stdout (run in background)

                }
            }


        //rest of the program down here
        printf("Why isnt it printing to stdout ??\n");

我應該使用孫子嗎? (雙分叉?)或......?

提前致謝

我上面的評論既不回答也不暗示; 這是一個問題。

我不明白為什么你需要再次分叉 - 你有一個沒有控制終端的過程(感謝setpgid)你想要的。 您可以在while(1)循環中處理接收的數據。 看起來你已經准備好了 - “程序的其余部分”進入了while循環。

編輯

調用fork會創建正在運行的進程的子副本。 在子節點中調用setsid將斷開子節點與終端的連接,但不會影響父節點(無論如何都會退出)。 我建議你從以下事情開始:

static void
process_stuff(int sockfd)
{
    while (1) {
        /* receive data on socket and process */
    }
}

void
run_daemon(int sockfd, int foreground)
{
    if (!foreground) {
        if (fork()) {
            exit(EXIT_SUCCESS); /* parent */
        }
        /* child */
        setsid();
    }
    process_stuff(sockfd);
}

擁有if (foreground)子句的原因是它允許您在gdb下的前台調試服務器時它不起作用。

暫無
暫無

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

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