1.Makefile
注意要使用c++11进行编译,所以文件名,g++格式都要进行变化
以上为第一个头文件
第二个头文件
#include <iostream>
#include <vector>
#include <string>
#include <unistd.h>
#include <sys/wait.h>
#include <functional>
#include <cassert>
#include <cstdlib>
#include <ctime>
#include "store.hpp"
#include"task.hpp"
void slaver(std::vector<task_t>&tasks)
{
while(1)
{
int cmd;
int n=read(0,&cmd,sizeof(int));
if(n==sizeof(int))
{
std::cout<<"slaver收到了一条命令,这是pid:"<<getpid()<<"收到的命令编号是:"<<cmd<<std::endl;
if(cmd>=0&&cmd<tasks.size())
{
tasks[cmd]();
}
}
if(n==0)
{
break;
}
}
}
void initchi(std::vector<channel>*channels,std::vector<task_t>&tasks,int processnum)
{
std::vector<int>oldfd;
for(int i=0;i<processnum;i++)
{
int pipefd[2];
int n=pipe(pipefd);
pid_t newid=fork();
if(newid==0)
{
std::cout<<"现在是子进程时间,它的pid是:"<<getpid()<<"现关闭历史进程运行此子进程"<<std::endl;
for(auto &a:oldfd)
{
std::cout<<"关闭了"<<a<<std::endl;
close(a);
}
std::cout<<"现对子进程进行操作,首先关闭写端"<<std::endl;
close(pipefd[1]);
std::cout<<"重定向子进程读端"<<std::endl;
dup2(pipefd[0],0);
std::cout<<"关闭子进程读端,准备执行任务"<<std::endl;
close(pipefd[0]);
slaver(tasks);
exit(0);
}
else{
std::cout<<"现在是父进程时间,准备创建子进程结构体"<<std::endl;
std::string name="process-"+std::to_string(i);
channels->push_back(channel(pipefd[1],newid ,name));
oldfd.push_back(pipefd[1]);
}
}
}
void Menu() {
std::cout << "################################################" << std::endl;
std::cout << "# 1. 去步行街 2. 去桃园 #" << std::endl;
std::cout << "# 3. 去小吃摊 4. 去荟园 #" << std::endl;
std::cout << "# -2. 退出 #" << std::endl;
std::cout << "#################################################" << std::endl;
}
void quitechannels(std::vector<channel>&channels)
{
for(auto &c:channels)
{
close (c.fd);
std::cout<<"关闭了一个子进程"<<std::endl;
waitpid(c.id,nullptr,0);
std::cout<<"进程等待回收,避免僵尸进程"<<std::endl;
}
}
void ctrlslaver(std::vector<channel>&channels)
{
int wh=0;
while(1)
{
int select=0;
Menu();
std::cout<<"请输入";
std::cin>>select;
if(select<0||select>5)
{
std::cout<<"因输入错误或用户退出,线程池终止"<<std::endl;
}
int cmdcode=select-1;
std::cout<<"任务进行中"<<std::endl;
write(channels[wh].fd, &cmdcode, sizeof(cmdcode));
wh++;
wh %= channels.size();
}
}
int main() {
srand(time(nullptr) ^ getpid() ^ 1023);
std::vector<task_t> tasks;
loadtask(&tasks);
int processnum = 4;
std::vector<channel> channels;
initchi(&channels, tasks, processnum);
ctrlslaver(channels);
quitechannels(channels);
return 0;
}
详细注释代码