命名管道——进程间通信
- 互联网
- 2025-09-15 09:03:01

个人主页:敲上瘾-CSDN博客
匿名管道:进程池的制作(linux进程间通信,匿名管道... ...)-CSDN博客
一、命名管道的使用 1.创建命名管道 1.1.在命令行中:创建:
mkfifo 管道名删除:
rm -rf 管道名或者:
unlink 管道名 1.2.在程序中创建:
声明如下:
#include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 返回值:成功:返回0。失败:返回-1,并设置 erron 以指示错误类型。参数1:指向一个以空字符结尾的字符串,表示要创建的命名管道的路径。参数2:指定文件的权限位(mode bits),类似于 open 函数中的权限参数。销毁:
#include <unistd.h> int unlink(const char *pathname); 返回值:如果成功删除文件,返回0,如果失败返回-1,并设置全局变量errno以指示具体的错误类型。参数1:指向一个以空字符结尾的字符串,表示要创建的命名管道的路径。示例:
mkfifo("./filename",0666);//创建 unlink("./filename");//销毁 2.使用命名管道当创建好管道后,进程通信就是简单的文件读写,如下:
把文件server.cc生成的程序作为读端。
#include<iostream> #include<sys/types.h> #include<sys/stat.h> #include<cstdio> #include<fcntl.h> #include<unistd.h> using namespace std; int main() { int f = mkfifo("./file",0666); int r_fd = open("file",O_RDONLY); char buf[1024]; while(true) { int n = read(r_fd,buf,sizeof(buf)-1); if(n > 0) { buf[n]='\0'; printf("Client say# %s\n",buf); } else if(n == 0) break; else return 1; } close(r_fd); unlink("file"); return 0; }注:对于管道的创建与销毁在其中一端进行就行。
假设把文件client.cc生成的程序作为写端
#include<iostream> #include<sys/types.h> #include<sys/stat.h> #include<cstdio> #include<fcntl.h> #include<unistd.h> using namespace std; int main() { int w_fd = open("file",O_WRONLY); while(true) { string message; cout<<"Please enter: "; getline(cin,message); write(w_fd,message.c_str(),message.size()); } close(w_fd); return 0; }注意:该文侧重点在于讲解对命名管道的使用,所以以上代码中省略了对调用函数成功与否的判断,在实际开发中需要加以判断。
效果如下:
二、命名管道与匿名管道的区别 1.创建上 匿名管道是在程序中使用pipe进行创建并打开的。命名管道可以在程序中使用mkfifo命令创建,也可以在程序中使用mkfifo函数创建。然后需要用open打开。 2.使用范围 匿名管道只能用于父子进程之间。命名管道可用于任意进程之间。 三、管道的特性注1:管道的四种特性和四种通信情况,对于匿名管道和命名管道都是一样的。
注2:管道的生命周期随进程,本质是内核中的缓冲区,命名管道文件只是标识,用于让多个进程找到同一块缓冲区,删除后,之前已经打开管道的进程依然可以通信
1.管道的五种特性 管道文件,自带同步机制。如上代码示例,如果写端和读端执行速度不一样,快的一端会迁就于慢的一端,最后实现同步。管道是面向字节流的。怎么读与怎么写并没有联系,比如写入“hello world”,但可能读到“hel”,这取决于你要读多少字节。管道是单向通信的。也就是a(表示进程)写的时候b读。b写的时候a在读。而不是既在写同时也在读。管道(文件)的生命周期是随进程的。进程结束管道也随之销毁。 2.管道的四种通信情况 写慢,读快 --- 读端就要阻塞(等待写端写入)。写快,读慢 --- 到管道容量满了后,写端就要阻塞(等待读端读取数据,然后就可以覆盖式地继续往管道写入)。写关闭,读继续 --- read就会返回0,表示文件结尾。写继续,读关闭 --- 写端不再有意义,系统会杀掉写端进程。非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!
命名管道——进程间通信由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“命名管道——进程间通信”
上一篇
              jvm内存不够,怎么重新分配
 
               
               
               
               
               
               
               
               
   
   
   
   
   
   
   
   
   
  ![基于博弈树的开源五子棋AI教程[3极大极小搜索]](/0pic/pp_66.jpg) 
   
   
  