0

私はすでにかなり多くのことを検索していて、おそらく私はすでにいくつかの有用な答えに出くわしたが、それらを理解することができなかったことを知っています...私はプログラマーの多くではありません:)

場合は、デーモン(その間に何が起こっているかとは完全に独立したバックグラウンドプロセス)を実装して、サーバー(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");

孫を使うべきですか?(ダブルフォーク?)または...?

前もって感謝します

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 に答える