首页 > 代码库 > 进程间通信 之 管道
进程间通信 之 管道
一 无名管道:
特点: 具有亲缘关系的进程间通信,但不仅仅指父子进程之间哦。
(1)无名管道的创建
int pipe(int pipefd
参数:
pipefd 数组的首地址
返回值:
成功返回0,失败返回-1
注意:
无名管道存在内核空间,创建成功会给用户空间两个文件描述符,fd[0]:读管道 fd[1]:写管道
思考:为什么无名管道只能用于亲缘关系间进程通信?
因为只有具有亲缘关系的进程存在数据拷贝 [拷贝文件描述符]
二。有名管道
特点:
(1)任意进程间通信
(2)文件系统中存在文件名
<1>创建有名管道文件
int mkfifo(const char *pathname, mode_t mode);
参数:
@pathname 文件名
@mode 指定的权限
返回值:
成功返回0,失败返回-1
<2>打开有名管道文件
open
注意:
一个进程以只读方式打开管道文件,则阻塞,直到另一个进程以写的方式打开管道文件
一个进程以只写方式打开管道文件,则阻塞,直到另一个进程以读的方式打开管道文件
<3>读写管道
read / write
下面加上一个管道之间通信的例子:
负责从管道中读
<pre name="code" class="cpp"> <pre name="code" class="cpp">#include <head.h> int read_fifo(int fd) { int n; char buf[1024]; while(1) { n = read(fd,buf,sizeof(buf) - 1); buf[n] = '\0'; printf("Read %d bytes : %s\n",n,buf); if(strncmp(buf,"quit",4) == 0) break; } return 0; } //./a.out fifoname int main(int argc, const char *argv[]) { int fd; if(argc < 2) { fprintf(stderr,"Usage : %s argv[1]\n",argv[0]); exit(EXIT_FAILURE); } //创建有名管道 if(mkfifo(argv[1],0666) < 0 && errno != EEXIST) { fprintf(stderr,"Fail to mkfifo %s : %s\n",argv[1],strerror(errno)); exit(EXIT_FAILURE); } fd = open(argv[1],O_RDONLY); if(fd < 0){ fprintf(stderr,"Fail to %s : %s\n",argv[1],strerror(errno)); exit(EXIT_FAILURE); } printf("Open success for read!\n"); read_fifo(fd); return 0; }
负责向管道中写
#include <head.h> int write_fifo(int fd) { char buf[1024]; while(1) { printf("input >"); fgets(buf,sizeof(buf),stdin); buf[strlen(buf) - 1] = '\0'; write(fd,buf,strlen(buf)); if(strncmp(buf,"quit",4) == 0) break; } return 0; } //./a.out fifoname int main(int argc, const char *argv[]) { int fd; if(argc < 2) { fprintf(stderr,"Usage : %s argv[1]\n",argv[0]); exit(EXIT_FAILURE); } //创建有名管道 if(mkfifo(argv[1],0666) < 0 && errno != EEXIST) { fprintf(stderr,"Fail to mkfifo %s : %s\n",argv[1],strerror(errno)); exit(EXIT_FAILURE); } fd = open(argv[1],O_WRONLY); if(fd < 0){ fprintf(stderr,"Fail to %s : %s\n",argv[1],strerror(errno)); exit(EXIT_FAILURE); } write_fifo(fd); return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。