• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            lighttpd - 1 - watcher 創建并監控 workers

            http://bbs.chinaunix.net/viewthread.php?tid=1251434
            ==================
            lighttpd 采用 多進程 的工作模式,watcher 創建 workers 并且監控 workers 的退出。

            watcher 循環創建 worker, 子進程 被創建后跳出循環做自己的工作。
            當創建夠 子進程 后,父進程 調用 wait() 等待有 子進程退出。
            當父進程wait()中收到信號 SIGHUP,通知進程組的所有成員。
            當服務器被關閉,父進程kill所有子進程,做清理工作,退出循環。
            ==================
            版本: 1.4.27
            <server.c>
            =================
            /// watcher 創建并監控 workers 工作
            #ifdef HAVE_FORK
                /* start watcher and workers */
                num_childs = srv->srvconf.max_worker;   // num_childs,需要創建的 worker 數量
                if (num_childs > 0) {
                    int child = 0;      // child 是一個 flag, 為0是watcher(父進程),為1是worker(子進程)
                    while (!child && !srv_shutdown && !graceful_shutdown) {     // 如果是父進程,且服務器沒有被關閉
                        if (num_childs > 0) { // num_childs>0, fork()創建子進程
                            switch (fork()) {
                            case -1:
                                return -1;
                            case 0:     // 子進程,置child為1。退出循環。
                                child = 1;
                                break;
                            default:    // 父進程,孩子數減1
                                num_childs--;
                                break;
                            }
                        } else {    // num_childs=0, 子進程已經創建完了,父進程wait()等待有子進程退出
                            int status;

                            if (-1 != wait(&status)) {  // 有子進程退出,num_childs++
                                /**
                                 * one of our workers went away
                                 */
                                num_childs++;
                            } else {    // wait 返回錯誤 (-1)
                                switch (errno) {
                                case EINTR:     // wait()被中斷打斷
                                    /**
                                     * if we receive a SIGHUP we have to close our logs ourself as we don't
                                     * have the mainloop who can help us here
                                     */
                                    if (handle_sig_hup) {   // 收到 SIGHUP, 關閉日志,通知進程組的所有進程
                                        handle_sig_hup = 0;

                                        log_error_cycle(srv);

                                        /**
                                         * forward to all procs in the process-group
                                         *
                                         * we also send it ourself
                                         */
                                        if (!forwarded_sig_hup) {
                                            forwarded_sig_hup = 1;
                                            kill(0, SIGHUP);    // pid=0 通知進程組所有成員
                                        }
                                    }
                                    break;
                                default:
                                    break;
                                }
                            }
                        }
                    }

                    /**
                     * for the parent this is the exit-point
                     */
                     /// 服務器被關閉。通知進程組所有成員
                     /// 父進程只在這時才退出循環
                    if (!child) {
                        /**
                         * kill all children too
                         */
                        if (graceful_shutdown) {
                            kill(0, SIGINT);
                        } else if (srv_shutdown) {
                            kill(0, SIGTERM);
                        }

                        // 清理工作
                        log_error_close(srv);
                        network_close(srv);
                        connections_free(srv);
                        plugins_free(srv);
                        server_free(srv);
                        return 0;
                    }
                }
            #endif

            posted on 2010-08-17 00:28 小默 閱讀(490) 評論(0)  編輯 收藏 引用 所屬分類: Network

            導航

            統計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            国产一区二区精品久久凹凸| 国产精品久久久久久久久免费| 精品国产青草久久久久福利| AV无码久久久久不卡网站下载| 97精品国产97久久久久久免费 | 91精品国产9l久久久久| 久久狠狠色狠狠色综合| 久久久久99精品成人片牛牛影视| 亚洲国产成人精品久久久国产成人一区二区三区综 | 99久久精品国产麻豆| 韩国三级中文字幕hd久久精品 | 久久久久久午夜成人影院| 青青国产成人久久91网| 久久精品国产男包| 亚洲嫩草影院久久精品| 久久午夜无码鲁丝片秋霞 | 麻豆AV一区二区三区久久| 国产精品成人无码久久久久久| 亚洲精品高清一二区久久| 青青草国产精品久久| 久久综合88熟人妻| 国色天香久久久久久久小说| 亚洲国产精品久久久久婷婷老年| 综合网日日天干夜夜久久| 久久99精品久久久久久噜噜| 国产亚洲精品自在久久| 99久久国产综合精品女同图片 | 日韩欧美亚洲综合久久| 97久久精品人人做人人爽| 97精品伊人久久大香线蕉app| 亚洲AV无码一区东京热久久| 伊人久久大香线蕉综合5g| 久久无码人妻精品一区二区三区 | 久久人与动人物a级毛片| 久久精品成人免费观看97| 精品久久久久中文字| 91久久九九无码成人网站| 久久最新精品国产| 亚洲国产成人久久综合碰碰动漫3d| 99久久99这里只有免费费精品| 久久天天躁狠狠躁夜夜躁2O2O|