日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【slighttpd】基于lighttpd架构的Server项目实战(3)—MasterWorker模式

發(fā)布時間:2024/1/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【slighttpd】基于lighttpd架构的Server项目实战(3)—MasterWorker模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載地址:https://blog.csdn.net/jiange_zh/article/details/50636180

現(xiàn)在,我們開始一步步構(gòu)建我們的項(xiàng)目了~

Master-Worker模式

本次一共涉及2個類:Master和Worker;

以下是兩者的頭文件:

/*************************************************************************> File Name: server.h> Author: Jiange> Mail: jiangezh@qq.com > Created Time: 2016年01月27日 星期三 19時33分00秒************************************************************************/ #ifndef _MASTER_H #define _MASTER_H#include "worker.h"#include <string>#include "event2/event.h" #include "event2/util.h"class Master {public:Master(); ~Master();bool StartMaster();static void MasterExitSignal(evutil_socket_t signo, short event, void *arg); //SIGINT信號回調(diào)函數(shù)static void MasterChldSignal(evutil_socket_t signo, short event, void *arg);Worker worker;struct event_base *m_base;struct event *m_exit_event;struct event *m_chld_event;int nums_of_child; //子進(jìn)程個數(shù) };#endif /*************************************************************************> File Name: worker.h> Author: Jiange> Mail: jiangezh@qq.com > Created Time: 2016年01月27日 星期三 20時10分35秒************************************************************************/ #ifndef _WORKER_H #define _WORKER_H#include <string> #include <map>#include "event2/event.h" #include "event2/util.h"#include "util.h"class Master;class Worker {public:Worker();~Worker();void Run();static void WorkerExitSignal(evutil_socket_t signo, short event, void *arg);Master *master;struct event_base *w_base;struct event *w_exit_event;std::string s_inbuf;std::string s_intmp;std::string s_outbuf; };#endif

? 具體實(shí)現(xiàn):

/*************************************************************************> File Name: master.cpp> Author: Jiange> Mail: jiangezh@qq.com > Created Time: 2016年01月27日 星期三 19時37分23秒************************************************************************/ #include "master.h" #include "worker.h"#include <unistd.h> #include <sys/types.h> #include <sys/wait.h>#include <iostream>Master::Master() {m_base = NULL;m_exit_event = NULL;m_chld_event = NULL;nums_of_child = 4; //4個子進(jìn)程 }Master::~Master() {if (m_base) {event_free(m_exit_event);event_free(m_chld_event);event_base_free(m_base);}std::cout << "Master Closed" << std::endl; }bool Master::StartMaster() {std::cout <, "Start Master" << std::endl;worker.master = this;//創(chuàng)建一定數(shù)量的workerwhile (nums_of_child > 0){switch(fork()) {case -1:return false;case 0:{worker.Run(); //worker子進(jìn)程入口return true;}default:--nums_of_child;break;}}//Master監(jiān)聽信號,一個用于退出,一個用于處理結(jié)束的子進(jìn)程m_base = event_base_new();m_exit_event = evsignal_new(m_base, SIGINT, Master::MasterExitSignal, m_base);m_chld_event = evsignal_new(m_base, SIGCHLD, Master::MasterChldSignal, this);evsignal_add(m_exit_event, NULL);evsignal_add(m_chld_event, NULL);//開始事件循環(huán)event_base_dispatch(m_base);return true; }void Master::MasterExitSignal(evutil_socket_t signo, short event, void *arg) {//通知所有子進(jìn)程,暫時不需要,因?yàn)槌绦虿皇鞘刈o(hù)進(jìn)程。//所有子進(jìn)程都跟終端關(guān)聯(lián),都會收到SIGINT//kill(0, SIGINT);//結(jié)束事件循環(huán)event_base_loopexit((struct event_base *)arg, NULL); }//防止子進(jìn)程僵死,使用waitpid而不是wait->可能多個子進(jìn)程同時關(guān)閉 void Master::MasterChldSignal(evutil_socket_t signo, short event, void *arg) {Master *master = (Master *)arg;pid_t pid;int stat;while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) {++(master->nums_of_child);std::cout << "Child " << pid << " terminated" << std::endl;} } /*************************************************************************> File Name: worker.cpp> Author: Jiange> Mail: jiangezh@qq.com > Created Time: 2016年01月28日 星期四 12時06分22秒************************************************************************/ #include "worker.h" #include "master.h"#include <stdlib.h> #include <iostream>Worker::Worker() {master = NULL;w_base = NULL;w_exit_event = NULL; }Worker::~Worker() {if (w_exit_event) event_free(w_exit_event);if (w_base) event_base_free(w_base);std::cout << "Worker closed" << std::endl; }void Worker::Run() {w_base = event_base_new();w_exit_event = evsignal_new(w_base, SIGINT, Worker::WorkerExitSignal, w_base);evsignal_add(w_exit_event, NULL);event_base_dispatch(w_base);return; }void Worker::WorkerExitSignal(evutil_socket_t signo, short event, void *arg) {event_base_loopexit((struct event_base *)arg, NULL); }

這樣子,一個簡單的“Master-Worker模式”就完成了。

測試入口:

/*************************************************************************> File Name: main.cpp> Author: Jiange> Mail: jiangezh@qq.com > Created Time: 2016年01月27日 星期三 19時29分26秒************************************************************************/ #include "master.h" #include <iostream>int main(int argc, char *argv[]) {Master master;std::cout << "----Slighttpd ----" << std::endl;if (!master.StartMaster()) return -1;std::cout << "-----Goodbye-----" << std::endl;return 0; }

需要注意的幾個點(diǎn):

? ?1.Master和Worker所做的事情是不同的,因此兩者均有自己獨(dú)立的event_base;

? ?2.worker的event_base_new()需要在run()函數(shù)中使用(在fork之后),而不能在構(gòu)造函數(shù)中初始化分配(fork之前)。否則,好像4個子進(jìn)程將公用同一個event_base。(Q:按理來說fork應(yīng)該是完全復(fù)制過來的,為什么會共用同一個呢?可能是跟libevent的實(shí)現(xiàn)方式有關(guān)?)

接下來,我們需要對它進(jìn)行拓展,以后將在Master中加入插件相關(guān)的內(nèi)容,在Worker中加入監(jiān)聽者Listener和連接者Connection。

總結(jié)

以上是生活随笔為你收集整理的【slighttpd】基于lighttpd架构的Server项目实战(3)—MasterWorker模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。