实现命名管道多进程任务派发
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