<Linux> 实现命名管道多进程任务派发

实现命名管道多进程任务派发

common文件


#ifndef _COMMON_H_
#define _COMMON_H_

#pragma once
#include <iostream>
#include <unistd.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <wait.h>
#include <fcntl.h>
#include <cstring>
#include <cassert>
#include <cstdio>
using namespace std;
string ipcpath = "fifo";

#endif

服务端

服务端只读

#include "common.hpp"
#define PROCESS_NUM 10
int main()
{
    char buffer[1024];
    memset(buffer, '\0', sizeof buffer);
    if (mkfifo(ipcpath.c_str(), 0666) < 0)
    {
        perror("create");
        exit(1);
    }

    int fd = open(ipcpath.c_str(), O_RDONLY);

    if (fd < 0)
    {
        perror("open");
        exit(1);
    }

    for (size_t i; i < 10; i++)
    {
        pid_t id = fork();

        if (0 == id)
        {
            while (true)
            {

                ssize_t ret = read(fd, buffer, sizeof(buffer) - 1);
                if (ret > 0)
                {
                    buffer[ret] = '\0';
                    cout << buffer << endl;
                }
                else if (0 == ret)
                {
                    break;
                }
                else
                {
                    perror("read");
                    exit(1);
                }
            }
            exit(0);
        }
    }

    for (size_t i = 0; i < PROCESS_NUM; i++)
    {
        waitpid(-1, nullptr, 0);
    }

    unlink(ipcpath.c_str());

    close(fd);
    return 0;
}

客户端

客户端只写

#include "common.hpp"

int main()
{
    int fd = open(ipcpath.c_str(), O_WRONLY);
    if (fd < 0)
    {
        perror("open");
        exit(1);
    }
    string str;

    while (true)
    {
        cout << "Please input message: ";
        // getline()
        getline(cin, str);

        write(fd, str.c_str(), str.size());
    }

    close(fd);

    return 0;
}

makefile

.PHONY:all
all:mutiClient mutiServer

mutiServer:mutiServer.cc
	g++ -o $@ $^  -std=c++11

mutiClient:mutiClient.cc
	g++ -o $@ $^  -std=c++11

.PHONY:clean
clean:
	rm -f mutiClient mutiServer
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【 Stack_OverFlow 】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值