2026/2/7 1:45:30
网站建设
项目流程
广州网站建设外贸,招标网站哪个好用,公众平台账号授权怎么弄,网站备案什么注销1.命名管道的原理1#xff0c;如果是具有血缘关系的进程#xff0c;想要通信我们可以使用匿名管道#xff0c;如果我们想在不相关的进程之间交换数据#xff0c;可以使用FIFO文件来做这项工作#xff0c;它经常被称为命名管道。2.在内核中#xff0c;操作系统会打开一个文…1.命名管道的原理1如果是具有血缘关系的进程想要通信我们可以使用匿名管道如果我们想在不相关的进程之间交换数据可以使用FIFO文件来做这项工作它经常被称为命名管道。2.在内核中操作系统会打开一个文件即在内核中仅有一个文件的inode结构体文件的files_operations结构体一个内核级别的文件缓冲区那么由于这两个进程可能会有不同的打开文件的方式并且两个文件的执行流不同读取写入到文件的位置可能也不同所以分别会给这两个进程各自分配一个文件打开对象。3.与匿名管道不同进程间的通信本质是让不同的进程看到同一份资源在匿名管道中子进程继承了父进程的文件描述符表父子进程一个关闭读端一个关闭写端从而实现进程间的通信命名管道这里两个不同的进程以只读和只写的方式打开文件也达到了看到同一份资源的目的。4.那么两个进程如何知道它们两个打开的是同一个文件因为进行打开的时候是采用的是同路径下的同一个文件名 路径 文件名 具有唯一性。5.同样的这个命名管道也管道它也具有管道的特征即单向通信并且不需要将缓冲区的内容刷新到磁盘上命名管道同样也是一个文件这个文件是内存级文件。2.创建命名管道命名管道可以从命令行上创建命令行方法是使用下面这个命令mkfifo filename命名管道也可以从程序里创建相关函数有int mkfifo(const char *filename,mode_t mode);mkfifo需要传参第一个参数传参命名文件的路径第二个传参命名文件的权限模式mkfifo的返回值是一个int的变量如果mkfifo创建命名管道成功那么就会返回0如果没有创建成功创建失败了那么就会返回-1并且设置对应的错误码。1 #includestdio.h 2 #includesys/stat.h 3 int main(int argc, char *argv[]) 4 { 5 mkfifo(myfifo,0644); 6 return 0; 7 }删除命名管道可以使用unlink。3.命名管道的4种情况读写端正常管道为空读端就要阻塞可以有效保护数据安全读写端正常 管道满了写端就要阻塞可以有效保护数据安全读端正常读写端关闭读端就会读到0代表读到了文件pipe结束读端退出不会阻塞写端正常写读端关闭操作系统就要通过13号信号杀掉正在写入的写端进程4.进程间编码的实现makefile1 .PHONY:all 2 all:client server 3 4 client:client.cpp 5 g -o $ $^ -g -stdc11 6 server:server.cpp 7 g -o $ $^ -g -stdc11 8 .PHONY:clean 9 clean: 10 rm -f client server生成client和server可执行程序pipename.hpp#pragma once #includeiostream #includestdio.h #includestdlib.h #include fcntl.h #include unistd.h #include sys/types.h #include sys/stat.h #include fcntl.h #includestring #includestring.h #define FILE ./log.txt #define MODE 0644 enum { FIFO_CREATE_ERR1, FIFO_DELETE_ERR, FIFO_OPEN_ERR }; class Init { public: Init() { int nmkfifo(FILE,MODE); if(n0) { perror(mkfifo); exit(FIFO_CREATE_ERR); } } ~Init() { int munlink(FILE); if(m0) { perror(mkfifo); exit(FIFO_DELETE_ERR); } } };将创建管道文件封装为一个类创建类时自动创建命名管道。client.cpp#include./pipe.hpp int main() { int fdopen(FILE,O_WRONLY); if(fd0) { perror(open); exit(FIFO_OPEN_ERR); } std::coutclinet open successstd::endl; std::string line; while(true) { std::coutPliease enter#; getline(std::cin,line); int nwrite(fd,line.c_str(),line.size()); } close(fd); return 0; }以只写模式打开文件不断的从键盘获取数据发送给文件。server.cpp#include./pipename.hpp int main() { Init p; int fdopen(FILE,O_RDONLY); if(fd0) { perror(open); exit(FIFO_OPEN_ERR); } while(true) { char buff[1024]; int nread(fd,buff,sizeof(buff)); if(n0) { buff[n]\0; std::coutclient say#buffstd::endl; } else { break; } } close(fd); return 0; }以只读模式打开并且打印在显示器上面进程退出时命名管道也会自动被删除。运行结果