中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

揭陽網(wǎng)站制作案例/如何在各種網(wǎng)站投放廣告

揭陽網(wǎng)站制作案例,如何在各種網(wǎng)站投放廣告,專題網(wǎng)站開發(fā)報價,建設(shè)公司網(wǎng)站方案目錄 一、守護(hù)進(jìn)程的定義與特點(diǎn) 1、定義 2、特點(diǎn) 二、守護(hù)進(jìn)程的原理 三、守護(hù)進(jìn)程與會話(Session)的關(guān)系 四、C實現(xiàn)守護(hù)進(jìn)程 守護(hù)進(jìn)程(Daemon Process)是一個在后臺運(yùn)行、通常不與用戶直接交互的進(jìn)程。守護(hù)進(jìn)程是操作系統(tǒng)中…

目錄

一、守護(hù)進(jìn)程的定義與特點(diǎn)

1、定義

2、特點(diǎn)

二、守護(hù)進(jìn)程的原理

三、守護(hù)進(jìn)程與會話(Session)的關(guān)系

四、C++實現(xiàn)守護(hù)進(jìn)程

?????守護(hù)進(jìn)程(Daemon Process)是一個在后臺運(yùn)行、通常不與用戶直接交互的進(jìn)程。守護(hù)進(jìn)程是操作系統(tǒng)中非常重要的一部分,常見的應(yīng)用包括系統(tǒng)日志、網(wǎng)絡(luò)服務(wù)、數(shù)據(jù)庫管理等。在這篇博客中,我們將詳細(xì)探討守護(hù)進(jìn)程的原理、如何與會話管理聯(lián)系,并通過C++實現(xiàn)一個簡單的守護(hù)進(jìn)程。將服務(wù)器守護(hù)進(jìn)程化的主要目的是確保服務(wù)器在后臺持續(xù)運(yùn)行,并在意外崩潰或重啟后自動恢復(fù)。這樣可以使服務(wù)在沒有人工干預(yù)的情況下長期穩(wěn)定運(yùn)行,并減少系統(tǒng)管理的復(fù)雜度。

一、守護(hù)進(jìn)程的定義與特點(diǎn)

1、定義

守護(hù)進(jìn)程是一個沒有終端控制的進(jìn)程,它通常在系統(tǒng)啟動時啟動,獨(dú)立于任何用戶會話(session),并且在后臺持續(xù)運(yùn)行。守護(hù)進(jìn)程的特點(diǎn)是它不依賴于用戶的輸入輸出,運(yùn)行時不會產(chǎn)生終端交互。

2、特點(diǎn)

  • 后臺運(yùn)行:守護(hù)進(jìn)程通常在操作系統(tǒng)啟動時啟動,或者在用戶登錄后由系統(tǒng)服務(wù)啟動,并在后臺持續(xù)運(yùn)行。
  • 無終端:守護(hù)進(jìn)程不與任何終端或用戶會話關(guān)聯(lián),它通常不與標(biāo)準(zhǔn)輸入輸出(stdin, stdout, stderr)相關(guān)聯(lián)。
  • 獨(dú)立性:守護(hù)進(jìn)程與用戶的登錄會話是獨(dú)立的,它在后臺靜靜運(yùn)行,執(zhí)行系統(tǒng)級任務(wù),如日志記錄、定時任務(wù)、文件清理等。
  • 父進(jìn)程為init進(jìn)程:守護(hù)進(jìn)程在系統(tǒng)啟動時由父進(jìn)程(通常是init進(jìn)程)啟動,運(yùn)行時不會退出。
  • PID(進(jìn)程ID):守護(hù)進(jìn)程的PID是由操作系統(tǒng)分配的,它通常會被寫入到某個文件中以供后續(xù)管理和終止。

二、守護(hù)進(jìn)程的原理

守護(hù)進(jìn)程是通過脫離控制終端、使自己成為一個獨(dú)立的后臺進(jìn)程來實現(xiàn)的。這是通過幾個步驟實現(xiàn)的:

  1. 創(chuàng)建子進(jìn)程:守護(hù)進(jìn)程首先會創(chuàng)建一個子進(jìn)程,父進(jìn)程退出,子進(jìn)程繼續(xù)執(zhí)行,這樣可以讓守護(hù)進(jìn)程避免與任何用戶會話或終端直接交互。

  2. 創(chuàng)建新的會話(Session):守護(hù)進(jìn)程通常會調(diào)用 setsid() 系統(tǒng)調(diào)用創(chuàng)建一個新的會話,成為該會話的首進(jìn)程。新會話的創(chuàng)建意味著它不再與原始的控制終端和進(jìn)程組相關(guān)聯(lián)。

  3. 改變工作目錄:守護(hù)進(jìn)程通常會調(diào)用 chdir() 來更改工作目錄。為了避免占用終端的目錄,守護(hù)進(jìn)程通常會將工作目錄更改為 /。

  4. 關(guān)閉文件描述符:守護(hù)進(jìn)程還會關(guān)閉與終端相關(guān)的文件描述符,包括標(biāo)準(zhǔn)輸入(stdin)、標(biāo)準(zhǔn)輸出(stdout)、標(biāo)準(zhǔn)錯誤(stderr)。通常會將它們重定向到 /dev/null,以防止輸出到終端。

  5. 忽略信號:守護(hù)進(jìn)程會設(shè)置適當(dāng)?shù)男盘柼幚?#xff0c;避免因收到如SIGHUP等信號導(dǎo)致進(jìn)程退出。

void Daemon(const std::string &cwd = "")
{// 1. 忽略其他異常信號 signal(SIGCLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);signal(SIGSTOP, SIG_IGN);// 2. 將自己變成獨(dú)立的會話if (fork() > 0)//>0說明是父進(jìn)程,讓父進(jìn)程直接退出exit(0);setsid(); //子進(jìn)程// 3. 更改當(dāng)前調(diào)用進(jìn)程的工作目錄if (!cwd.empty())chdir(cwd.c_str());// 4. 標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯誤重定向至/dev/null 垃圾桶int fd = open(nullfile.c_str(), O_RDWR);if(fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}
}

三、守護(hù)進(jìn)程與會話(Session)的關(guān)系

會話(Session)是與進(jìn)程、終端和進(jìn)程組密切相關(guān)的概念。會話的作用是管理一組相關(guān)的進(jìn)程。

  1. 會話的創(chuàng)建:每個登錄的用戶會話都有一個會話ID(Session ID),一個會話可以有多個進(jìn)程組(Process Group),而每個進(jìn)程組中的進(jìn)程共享同一個控制終端。

  2. 脫離控制終端:守護(hù)進(jìn)程通過 setsid() 系統(tǒng)調(diào)用來脫離當(dāng)前會話及其控制終端,成為一個新的會話的首進(jìn)程。這樣,守護(hù)進(jìn)程就不再與任何終端關(guān)聯(lián),它可以自由地運(yùn)行而不受用戶的控制。

  3. 控制終端:一旦守護(hù)進(jìn)程創(chuàng)建了新的會話并成為首進(jìn)程,它就不再與任何控制終端關(guān)聯(lián)??刂平K端通常與用戶的登錄會話相關(guān)聯(lián),但守護(hù)進(jìn)程會斷開這一關(guān)系,避免終端輸入或輸出干擾其運(yùn)行。

  4. 進(jìn)程組與信號處理:會話中的進(jìn)程通常共享進(jìn)程組,而進(jìn)程組的控制由會話首進(jìn)程管理。守護(hù)進(jìn)程通常會設(shè)置信號處理機(jī)制,使其能夠管理來自進(jìn)程組的信號。


四、C++實現(xiàn)守護(hù)進(jìn)程

#pragma once#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <signal.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>const std::string nullfile = "/dev/null";void Daemon(const std::string &cwd = "")
{// 1. 忽略其他異常信號 signal(SIGCLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);signal(SIGSTOP, SIG_IGN);// 2. 將自己變成獨(dú)立的會話if (fork() > 0)//>0說明是父進(jìn)程,讓父進(jìn)程直接退出exit(0);setsid(); //子進(jìn)程// 3. 更改當(dāng)前調(diào)用進(jìn)程的工作目錄if (!cwd.empty())chdir(cwd.c_str());// 4. 標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯誤重定向至/dev/null 垃圾桶int fd = open(nullfile.c_str(), O_RDWR);if(fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}
}
#pragma once#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>
#include <signal.h>
#include <signal.h>
#include "Log.hpp"
#include "ThreadPool.hpp"
#include "Task.hpp"
#include "Daemon.hpp"const int defaultfd = -1;
const std::string defaultip = "0.0.0.0";
const int backlog = 10; // 但是一般不要設(shè)置的太大
extern Log lg;enum
{UsageError = 1,SocketError,BindError,ListenError,
};class TcpServer;class ThreadData
{
public:ThreadData(int fd, const std::string &ip, const uint16_t &p, TcpServer *t): sockfd(fd), clientip(ip), clientport(p), tsvr(t){}
public:int sockfd;std::string clientip;uint16_t clientport;TcpServer *tsvr;
};class TcpServer
{
public:TcpServer(const uint16_t &port, const std::string &ip = defaultip) : listensock_(defaultfd), port_(port), ip_(ip){}void InitServer(){listensock_ = socket(AF_INET, SOCK_STREAM, 0);if (listensock_ < 0){lg(Fatal, "create socket, errno: %d, errstring: %s", errno, strerror(errno));exit(SocketError);}lg(Info, "create socket success, listensock_: %d", listensock_);int opt = 1;setsockopt(listensock_, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &opt, sizeof(opt)); // 防止偶發(fā)性的服務(wù)器無法進(jìn)行立即重啟(tcp協(xié)議的時候再說)struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(port_);inet_aton(ip_.c_str(), &(local.sin_addr));// local.sin_addr.s_addr = INADDR_ANY;if (bind(listensock_, (struct sockaddr *)&local, sizeof(local)) < 0){lg(Fatal, "bind error, errno: %d, errstring: %s", errno, strerror(errno));exit(BindError);}lg(Info, "bind socket success, listensock_: %d", listensock_);// Tcp是面向連接的,服務(wù)器一般是比較“被動的”,服務(wù)器一直處于一種,一直在等待連接到來的狀態(tài)if (listen(listensock_, backlog) < 0){lg(Fatal, "listen error, errno: %d, errstring: %s", errno, strerror(errno));exit(ListenError);}lg(Info, "listen socket success, listensock_: %d", listensock_);}void Start(){Daemon();ThreadPool<Task>::GetInstance()->Start();// for fork();// signal(SIGCHLD, SIG_IGN);lg(Info, "tcpServer is running....");for (;;){// 1. 獲取新連接struct sockaddr_in client;socklen_t len = sizeof(client);int sockfd = accept(listensock_, (struct sockaddr *)&client, &len);if (sockfd < 0){lg(Warning, "accept error, errno: %d, errstring: %s", errno, strerror(errno)); //?continue;}uint16_t clientport = ntohs(client.sin_port);char clientip[32];inet_ntop(AF_INET, &(client.sin_addr), clientip, sizeof(clientip));// version 4 --- 線程池版本Task t(sockfd, clientip, clientport);ThreadPool<Task>::GetInstance()->Push(t);}}~TcpServer() {}private:int listensock_;uint16_t port_;std::string ip_;
};

表示服務(wù)已經(jīng)啟動

http://www.risenshineclean.com/news/89.html

相關(guān)文章:

  • 網(wǎng)站免費(fèi)正能量入口/百度首頁推薦關(guān)不掉嗎
  • 網(wǎng)站建設(shè)步驟及分工/優(yōu)秀軟文范例100字
  • 對網(wǎng)站進(jìn)行優(yōu)化/網(wǎng)站排名快速提升
  • 武城網(wǎng)站建設(shè)費(fèi)用/品牌營銷公司
  • 佛山市企業(yè)網(wǎng)站建設(shè)平臺/太原關(guān)鍵詞優(yōu)化軟件
  • 做網(wǎng)站大概價格/南昌seo排名優(yōu)化
  • 做網(wǎng)站的公司有前途嗎/如何制作網(wǎng)站和網(wǎng)頁
  • 免費(fèi)建站的站點(diǎn)網(wǎng)站/游戲推廣是什么工作
  • 無錫企業(yè)網(wǎng)站seo/百度廣告投訴電話
  • 網(wǎng)站代碼怎么改/個人在線做網(wǎng)站免費(fèi)
  • 網(wǎng)站首頁html/怎樣打百度人工客服熱線
  • 深圳市企業(yè)網(wǎng)站建設(shè)價格/整合營銷理論主要是指
  • 個人主頁頁面/seo優(yōu)化招商
  • 工信部網(wǎng)站備案查詢步驟詳解/公司網(wǎng)站
  • 做航模的網(wǎng)站/網(wǎng)銷怎么做
  • 網(wǎng)站pv統(tǒng)計方法/推廣策劃方案
  • tornado 做網(wǎng)站/seo刷詞工具在線
  • 網(wǎng)站建設(shè)和維護(hù)合同/湖南seo優(yōu)化首選
  • 淘寶網(wǎng)站建設(shè)哪個類目/seo公司
  • 做網(wǎng)站怎么偷源碼做網(wǎng)站/阿里seo排名優(yōu)化軟件
  • 電商網(wǎng)站建設(shè)與運(yùn)營/網(wǎng)站管理
  • 文學(xué)投稿網(wǎng)站平臺建設(shè)/好f123網(wǎng)站
  • 做網(wǎng)站策劃需要用什么軟件/bt磁力搜索引擎在線
  • 沈陽網(wǎng)站建設(shè)制作公司/友情鏈接怎么設(shè)置
  • 學(xué)校資源網(wǎng)站的建設(shè)方案/東莞seo推廣機(jī)構(gòu)帖子
  • 建設(shè)部資質(zhì)上報系統(tǒng)網(wǎng)站/重慶百度推廣優(yōu)化
  • 南昌網(wǎng)站建設(shè)哪家好/什么軟件可以推廣自己的產(chǎn)品
  • 個人網(wǎng)站 作品/站長之家工具
  • 吳謹(jǐn)含廠家不愿做網(wǎng)站/平臺網(wǎng)站開發(fā)公司
  • 網(wǎng)站項目策劃書實例/網(wǎng)絡(luò)推廣深圳有效渠道