1.将File练习题,内部的FILE*描述符,改成int描述符
2。写一个类Fifo管道类。提高难度,什么都不提示。只要求:使用自己编写的Fifo类对象,实现2个终端之间互相聊天
file.cpp
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>
#include <head.h>
using namespace std;class File{
private:int fp;
public:File(){fp=open("./1.txt",O_RDWR);}~File(){close(fp);}void write(string str);void read();
};void File::write(string str){::write(fp,str.data(),str.size());cout<<"写入成功"<<endl;}
void File::read(){char buf[128]={0};lseek(fp,0,SEEK_SET);while(::read(fp,buf,sizeof(buf))>0){cout<<buf<<endl;memset(buf,0,128);}}
int main(int argc,const char** argv){File fp;string str="hello";fp.write(str);fp.read();return 0;
}
fifo1.cpp
#include <iostream>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <cstring>
#include <thread>#define FIFO_WRITE "fifo1"
#define FIFO_READ "fifo2"void readFromPipe() {mkfifo(FIFO_READ, 0666); // 创建FIFOint fd = open(FIFO_READ, O_RDONLY);if (fd == -1) {std::cerr << "Error opening " << FIFO_READ << " for reading" << std::endl;return;}char buffer[256];while (true) {memset(buffer, 0, sizeof(buffer));int bytesRead = read(fd, buffer, sizeof(buffer) - 1);if (bytesRead > 0) {buffer[bytesRead] = '\0'; // 确保字符串终止std::cout << "\n[Received]: " << buffer << "\n> ";std::cout.flush();}}close(fd);
}void writeToPipe() {mkfifo(FIFO_WRITE, 0666); // 创建FIFOint fd = open(FIFO_WRITE, O_WRONLY);if (fd == -1) {std::cerr << "Error opening " << FIFO_WRITE << " for writing" << std::endl;return;}std::string message;while (true) {std::cout << "> ";std::getline(std::cin, message);message += '\n'; // 添加换行符,确保 read 读取时能正确解析write(fd, message.c_str(), message.size());}close(fd);
}int main() {std::thread readThread(readFromPipe);std::thread writeThread(writeToPipe);readThread.join();writeThread.join();return 0;
}
fifo2.cpp
#include <iostream>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <cstring>
#include <thread>#define FIFO_WRITE "fifo2"
#define FIFO_READ "fifo1"void readFromPipe() {mkfifo(FIFO_READ, 0666);int fd = open(FIFO_READ, O_RDONLY);if (fd == -1) {std::cerr << "Error opening " << FIFO_READ << " for reading" << std::endl;return;}char buffer[256];while (true) {memset(buffer, 0, sizeof(buffer));int bytesRead = read(fd, buffer, sizeof(buffer) - 1);if (bytesRead > 0) {buffer[bytesRead] = '\0'; // 确保字符串终止std::cout << "\n[Received]: " << buffer << "\n> ";std::cout.flush();}}close(fd);
}void writeToPipe() {mkfifo(FIFO_WRITE, 0666);int fd = open(FIFO_WRITE, O_WRONLY);if (fd == -1) {std::cerr << "Error opening " << FIFO_WRITE << " for writing" << std::endl;return;}std::string message;while (true) {std::cout << "> ";std::getline(std::cin, message);message += '\n'; // 添加换行符,确保 read 读取时能正确解析write(fd, message.c_str(), message.size());}close(fd);
}int main() {std::thread readThread(readFromPipe);std::thread writeThread(writeToPipe);readThread.join();writeThread.join();return 0;
}