0

我已经搜索了很多,并且知道也许我已经遇到了一些有用的答案,但无法理解它们……我并不是一个真正的程序员:)

情况是我想实现一个守护进程 - 后台进程完全独立于同时发生的事情 - 解析从服务器接收的数据(正在编写 IRC 客户端),但使用 select 以非阻塞方式进行()。

这是我的代码片段。但我无法在程序的注释//rest 下访问 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");

我应该用孙子吗?(双叉?)还是...?

提前致谢

4

1 回答 1

2

我上面的评论既不是答案也不是建议;这是一个问题。

我不明白你为什么需要再次分叉 - 你有一个没有控制终端的进程(感谢 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它不工作时在前台调试服务器。

于 2012-05-06T20:10:17.410 回答