国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux后端服務(wù)器開發(fā)】管道設(shè)計

這篇具有很好參考價值的文章主要介紹了【Linux后端服務(wù)器開發(fā)】管道設(shè)計。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、管道通信

二、匿名管道

1. 匿名管道通信

2. 匿名管道設(shè)計

三、命名管道

comm.hpp

client.cc

serve.cc


一、管道通信

進程通信

數(shù)據(jù)傳輸:一個進程需要將它的數(shù)據(jù)發(fā)送給另一個進程

資源共享:多個進程之間共享同樣的資源

通知事件:一個進程向另一個(一組)進程發(fā)送信息,通知它們發(fā)生了某種事件

進程控制:一個進程完全控制另一個進程的執(zhí)行,如debug

通信本質(zhì)

OS直接或間接給通信雙方提供內(nèi)存空間

通信的進程雙方,能夠讀取到一份公共資源

管道文件是內(nèi)存級文件

管道創(chuàng)建

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道

?

管道讀寫端

  • 如果管道沒有了數(shù)據(jù),讀端在讀,默認會阻塞等待正在讀取的進程
  • 管道是固定大小的空間,寫端寫滿的時候,會阻塞等待讀端讀取
  • 寫端關(guān)閉,讀端在讀,則讀端讀完管道數(shù)據(jù)也關(guān)閉
  • 讀端關(guān)閉,寫端在寫,OS終止寫端

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道

int main() 
{
    int fds[2];
    int n = pipe(fds);
    assert(n == 0);

    cout << "fds[0]: " << fds[0] << endl;
    cout << "fds[1]: " << fds[1] << endl;

    return 0;
}

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道

管道可用于父子、兄弟、祖孫進程之間通信

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道

二、匿名管道

1. 匿名管道通信

#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <cassert>
#include <cstring>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;

int main() 
{
    // 1. 創(chuàng)建管道文件,打開讀寫端
    int fds[2];
    int n = pipe(fds);
    assert(n == 0);

    // 2. fork()
    pid_t id = fork();
    if (id == 0) 
    {
        //子進程通信代碼
        close(fds[0]);  //關(guān)閉讀端
        const char* s = "我是子進程,我正在給你發(fā)消息";
        int cnt = 0;
        while (true) 
        {
            char buffer[1024];
            snprintf(buffer, sizeof(buffer), "child->parent say: %s[%d][%d]", s, cnt++, getpid());
            write(fds[1], buffer, strlen(buffer));
            sleep(1);
        }
        exit(0);
    }

    //父進程通信代碼
    close(fds[1]);  //關(guān)閉寫端
    while (true) 
    {
        char buffer[1024];
        ssize_t s = read(fds[0], buffer, sizeof(buffer) - 1);
        if (s > 0) 
            buffer[s] = 0;
        cout << "Get Message# " << getpid() << buffer  << " | my pid: " << getpid() << endl;
        //父進程沒有sleep
    }
    n = waitpid(id, nullptr, 0);
    assert(n == id);

    return 0;
}

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道

2. 匿名管道設(shè)計

  • 將任務(wù)存入存入任務(wù)表vector中,將子進程存入信息存入subs容器中
  • 父進程隨機將任務(wù)碼發(fā)給5個子進程,子進程讀取任務(wù)碼完成任務(wù)(父進程為寫端,子進程為讀端),若子進程未讀取任務(wù),則進行阻塞等待
  • 通過隨機數(shù)分配任務(wù)給隨機子進程,讓子進程負載均衡

代碼設(shè)計流程:

  1. 建立任務(wù)表,建立子進程及和子進程通信的信道
  2. 父進程控制子進程,進行任務(wù)分配
  3. 回收子進程信息
#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <cassert>
#include <cstring>
#include <string>
#include <sys/types.h>
#include <sys/wait.h>
#include <vector>
using namespace std;

#define MakeSeed() srand((unsigned int)time(nullptr) ^ getpid())
#define PROCESS_NUM 5
#define TASK_NUM 10

typedef void(*func_t)();

void DownLoad() 
{
    cout << getpid() << " DownLoad Task" << endl;
    sleep(1);
}

void IOTask() 
{
    cout << getpid() << " IO Task" << endl;
    sleep(1);
}

void FlushTask() 
{
    cout << getpid() << " Flush Task" << endl;
}

void LoadTaskFunc(vector<func_t>& funcMap) 
{
    funcMap.push_back(DownLoad);
    funcMap.push_back(IOTask);
    funcMap.push_back(FlushTask);
}

/

class subEp 
{
public:
    subEp(pid_t subID, int writeFd)
        : _subID(subID), _writeFd(writeFd) 
    {
        char nameBuffer[1024];
        snprintf(nameBuffer, sizeof(nameBuffer), "process-%d[pid(%d)-fd(%d)]", num++, subID, _writeFd);
        _name = nameBuffer;
    }

    static int num;
    string _name;
    pid_t _subID;
    int _writeFd;
};

int subEp::num = 0;

// 讀取
int RecvTask(int readFd) 
{
    int code = 0;
    ssize_t s = read(readFd, &code, sizeof(code));
    if (s == sizeof(int)) 
        return code;
    else if (s <= 0) 
        return -1;
    else 
        return 0;
}

void CreateSubProcess(vector<subEp>& subs, vector<func_t>& funcMap) 
{
    vector<int> deleteFd;
    for (int i = 0; i < PROCESS_NUM; ++i) 
    {
        int fds[2];
        int n = pipe(fds);
        assert(n == 0);
        (void) n;

        pid_t id = fork();
        if (id == 0) 
        {
            //建立一對一管道
            for (int i = 0; i < deleteFd.size(); ++i) 
                close(deleteFd[i]);
            //子進程處理任務(wù)
            close(fds[1]);
            while (true) 
            {
                // 1. 獲取任務(wù)碼,如果沒收到任務(wù)碼,則阻塞等待
                int commandCode = RecvTask(fds[0]);
                // 2. 執(zhí)行任務(wù)
                if (commandCode >= 0 && commandCode < funcMap.size()) 
                    funcMap[commandCode]();
                else 
                    break;
            }
            exit(0);
        }
        close(fds[0]);
        subEp sub(id, fds[1]);
        subs.push_back(sub);
        deleteFd.push_back(fds[1]);
    }
}

void SendTask(const subEp& process, int taskNum) 
{
    cout << "send task num " << taskNum << " to " << process._name << endl;
    int n = write(process._writeFd, &taskNum, sizeof(taskNum));
    assert(n == sizeof(int));
    (void)n;
}

void LoadBlanceContrl(const vector<subEp>& subs, vector<func_t>& funcMap, int count) 
{
    int procNum = subs.size();
    int taskNum = funcMap.size();
    while (count--) 
    {
        int subIDx = rand() % procNum;
        int taskIDx = rand() % taskNum;
        SendTask(subs[subIDx], taskIDx);
        sleep(1);
    }
    for (int i = 0; i < procNum; ++i) 
        close(subs[i]._writeFd);
}

void WaitProcess(vector<subEp>& subs) 
{
    int procNum = subs.size();
    for (int i = 0; i < procNum; ++i) 
    {
        waitpid(subs[i]._subID, nullptr, 0);
        cout << "wait sub process success ... " << subs[i]._subID << endl;
    }
}

int main() 
{
    MakeSeed();
    // 1. 建立子進程并建立和子進程通信的信道
    //    [子進程id,wfd]
    vector<func_t> funcMap;
    LoadTaskFunc(funcMap);
    vector<subEp> subs;
    CreateSubProcess(subs, funcMap);

    // 2. 父進程控制子進程
    LoadBlanceContrl(subs, funcMap, TASK_NUM);

    // 3. 回收子進程信息
    WaitProcess(subs);

    return 0;
}

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道

三、命名管道

讓不同進程打開指定名稱(路徑+文件名)的同一個文件

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道

comm.hpp

#pragma once

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <string>
#include <cstring>
#include <cerrno>
#include <cassert>
#include <unistd.h>
#include <fcntl.h>
#include <fstream>

#define NAMED_PIPE "/root/test/pipe/named_pipe"

bool CreateFilo(const std::string& path) 
{
    umask(0);
    int n = mkfifo(path.c_str(), 0666);
    if (n == 0) 
    {
        return true;
    }
    else 
    {
        std::cout << "errno: " << errno << "err string: " << strerror(errno) << std::endl;
        return false;
    }
}

void RemoveFifo(const std::string& path) 
{
    int n = unlink(path.c_str());
    assert(n == 0);     //意料之中用assert判斷,意料之外用 if else
    (void)n;
}

client.cc

#include "comm.hpp"

int main() 
{
    std::cout << "client begin" << std::endl;
    int wfd = open(NAMED_PIPE, O_WRONLY, 0666);
    std::cout << "client end" << std::endl;
    if (wfd < 0) 
        exit(1);

    //write
    char buffer[1024];
    while (true) 
    {
        std::cout << "please say# ";
        fgets(buffer, sizeof(buffer), stdin);
        if (strlen(buffer) > 0) 
            buffer[strlen(buffer) - 1] = 0;        
        ssize_t n = write(wfd, buffer, strlen(buffer));
        assert(n == strlen(buffer));
        (void)n;
    }

    close(wfd);
    return 0;
}

serve.cc

#include "comm.hpp"

int main() 
{
    bool r = CreateFilo(NAMED_PIPE);
    assert(r);
    (void)r;

    std::cout << "serve begin" << std::endl;
    int rfd = open(NAMED_PIPE, O_RDONLY);
    std::cout << "serve end" << std::endl;
    if (rfd < 0) 
        exit(1);

    //read
    char buffer[1024];
    while (true) 
    {
        ssize_t s = read(rfd, buffer, sizeof(buffer) - 1);
        if (s > 0) 
        {
            std::cout << "client->serve# " << buffer << std::endl;
        }
        else 
        {
            perror("read");
            exit(1);
        }
    }

    close(rfd);

    RemoveFifo(NAMED_PIPE);
    return 0;
}

【Linux后端服務(wù)器開發(fā)】管道設(shè)計,Linux后端服務(wù)器開發(fā),服務(wù)器,linux,進程間通信,管道,命名管道,匿名管道文章來源地址http://www.zghlxwxcb.cn/news/detail-547059.html

到了這里,關(guān)于【Linux后端服務(wù)器開發(fā)】管道設(shè)計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Linux后端服務(wù)器開發(fā)】封裝線程池實現(xiàn)TCP多線程通信

    目錄 一、線程池模塊 Thread.h LockGuard.h ThreadPool.h 二、任務(wù)模塊模塊 Task.h 三、日志模塊 Log.h 四、守護進程模塊 Deamon.h ?五、TCP通信模塊 Server.h Client.h server.cpp client.cpp 關(guān)于TCP通信協(xié)議的封裝,此篇博客有詳述: 【Linux后端服務(wù)器開發(fā)】TCP通信設(shè)計_命運on-9的博客-CSDN博客 線程池

    2024年02月16日
    瀏覽(25)
  • 【Linux后端服務(wù)器開發(fā)】協(xié)議定制(序列化與反序列化)

    【Linux后端服務(wù)器開發(fā)】協(xié)議定制(序列化與反序列化)

    目錄 一、應(yīng)用層協(xié)議概述 二、序列化與反序列化 Protocal.h頭文件 Server.h頭文件 Client.h頭文件 server.cpp源文件 client.cpp源文件 什么是應(yīng)用層 ?我們通過編寫程序解決一個個實際問題、滿足我們?nèi)粘P枨蟮木W(wǎng)絡(luò)程序,都是應(yīng)用層程序。 協(xié)議是一種“約定”,socket的api接口,在讀

    2024年02月16日
    瀏覽(21)
  • 強推Linux高性能服務(wù)器編程, 真的是后端開發(fā)技術(shù)提升, 沉淀自身不容錯過的一本經(jīng)典書籍

    強推Linux高性能服務(wù)器編程, 真的是后端開發(fā)技術(shù)提升, 沉淀自身不容錯過的一本經(jīng)典書籍

    目錄 第1章 TCP/IP協(xié)議 1.1 TCP/IP協(xié)議族體系結(jié)構(gòu)以及主要協(xié)議 1.1.1 數(shù)據(jù)鏈路層 1.1.2 網(wǎng)絡(luò)層 1.1.3 傳輸層 1.1.4 應(yīng)用層 1.2 封裝 1.3 分用 1.5 ARP協(xié)議工作原理 1.5.1 以太網(wǎng)ARP請求/應(yīng)答報文詳解 1.5.2 ARP高速緩存的查看和修改 1.5.3 使用tcpdump觀察ARP通信過程所得結(jié)果如下 本篇核心關(guān)鍵所在

    2024年02月07日
    瀏覽(119)
  • 如何在linux服務(wù)器上用Nginx部署Vue項目,以及如何部署springboot后端項目

    如何在linux服務(wù)器上用Nginx部署Vue項目,以及如何部署springboot后端項目

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 提示:這里可以添加本文要記錄的大概內(nèi)容: 本文內(nèi)容記錄如何在Linux(Ubuntu)系統(tǒng)上安裝Nginx,并部署打包好的Vue前端項目,最后通過瀏覽器訪問。 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

    2024年04月16日
    瀏覽(31)
  • 深度學(xué)習(xí)服務(wù)器(Linux)開發(fā)環(huán)境搭建教程

    深度學(xué)習(xí)服務(wù)器(Linux)開發(fā)環(huán)境搭建教程

    當(dāng)你拿到一臺服務(wù)器的使用權(quán)時,最頭疼的莫過于登陸服務(wù)區(qū)并配置開發(fā)環(huán)境。本文將從0開始,講述一臺剛申請的服務(wù)器遠程登陸并配置開發(fā)環(huán)境的全過程。希望對你有所幫助 打開MobaXterm軟件,創(chuàng)建一個新的Session,選擇SSH登陸。其中Remote host填服務(wù)器的IP地址,Specify userna

    2024年02月05日
    瀏覽(19)
  • FTP服務(wù)器移植到Linux開發(fā)板

    FTP服務(wù)器移植到Linux開發(fā)板

    提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 提示:這里可以添加本文要記錄的大概內(nèi)容: 將Linux開發(fā)板作為一個小型的 FTP 服務(wù)器,這樣就可以通過 FileZilla 軟件直接在開發(fā)板和 windows 之間通過網(wǎng)絡(luò)進行文件互傳。在開發(fā)板上搭建 FTP 服務(wù)器很簡單

    2024年02月14日
    瀏覽(22)
  • 使用pycharm遠程連接到Linux服務(wù)器進行開發(fā)

    使用pycharm遠程連接到Linux服務(wù)器進行開發(fā)

    本地的 PyCharm 能達到和遠程服務(wù)器之間的文件同步; 本地的 PyCharm 能夠使用遠程服務(wù)器的開發(fā)環(huán)境; PyCharm:PyCharm 2021.3 (Professional Edition) Linux服務(wù)器:Ubuntu20.04 配置項路徑:Tools ,Deployment,Configuration 在 Connection?標簽頁中,點擊【···】,對 SFTP 連接進行編輯。 Username:注

    2024年02月08日
    瀏覽(22)
  • 基于linux下的高并發(fā)服務(wù)器開發(fā)(第一章)- Linux系統(tǒng)IO函數(shù)

    基于linux下的高并發(fā)服務(wù)器開發(fā)(第一章)- Linux系統(tǒng)IO函數(shù)

    ?(1)man 2 open 打開一個已經(jīng)存在的文件 int open(const char *pathname, int flags); 參數(shù): ? ? ? ? ? ? pathname:要打開文件路徑 ? ? ? ? ? ? - flags:對文件的操作權(quán)限設(shè)置還有其他的設(shè)置 ? ? ? ? ? ? O_RDONLY,O_WRONLY,O_RDWR 這三個設(shè)置是互斥的 返回值: ? ? ? ? ? ? 返回一個新的文件描述

    2024年02月16日
    瀏覽(26)
  • 「遠程開發(fā)」VSCode使用SSH遠程linux服務(wù)器 - 公網(wǎng)遠程連接

    「遠程開發(fā)」VSCode使用SSH遠程linux服務(wù)器 - 公網(wǎng)遠程連接

    轉(zhuǎn)發(fā)自cpolar內(nèi)網(wǎng)穿透的文章:【Vscode遠程開發(fā)】使用SSH遠程連接服務(wù)器 「內(nèi)網(wǎng)穿透」 遠程連接服務(wù)器工具有很多,比如XShell、putty等,可以通過ssh來遠程連接服務(wù)器,但這用于寫代碼并不方便,可能需要現(xiàn)在本地寫好代碼后再將源代碼傳送到服務(wù)器運行、服務(wù)器上的圖片也無

    2024年02月06日
    瀏覽(31)
  • VSCode使用Remote SSH遠程連接Linux服務(wù)器【遠程開發(fā)】

    VSCode使用Remote SSH遠程連接Linux服務(wù)器【遠程開發(fā)】

    轉(zhuǎn)發(fā)自CSDN遠程穿透的文章:【vscode遠程開發(fā)】使用SSH遠程連接服務(wù)器 「內(nèi)網(wǎng)穿透」 遠程連接服務(wù)器工具有很多,比如XShell、putty等,可以通過ssh來遠程連接服務(wù)器,但這用于寫代碼并不方便,可能需要現(xiàn)在本地寫好代碼后再將源代碼傳送到服務(wù)器運行、服務(wù)器上的圖片也無

    2023年04月21日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包