IPC_管道

原理

每个进程有各自不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到。所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间中拷贝到缓冲区,进程2再从缓冲区把数据读走。内核提供的这种机制就是进程间通信。
通信需要媒介,两个进程间通信的媒介就是内存。通信的原理就是让两个或多个进程能够看到同一块共同的资源,这块资源一般都是由内存提供。

(1)匿名管道

int pipe(int fd[2]);

在这里插入图片描述
匿名管道是存在内存中的特殊文件,只能用于具有血缘关系的进程间通信,通常用于父子进程建通信:
子进程往管道中写数据,写数据时要关闭读端
父进程往管道中读数据,写数据时要关闭写端
在这里插入图片描述

(2)命名管道

int mkfifo(const char* pathname, mode_t mode);

命名管道提供了一个路径名与之关联,以FIFO文件的形式存储于文件系统中,能够实现任何两个进程之间通信。

应用

命令:who | sort | lp
| 即匿名管道

区别

匿名管道是由pipe函数创建 并打开的;
命名管道是由mkfifo函数创建 的 ,打开用open;

这是因为:命名管道是设备文件,它是存储在硬盘上的,而管道是存在内存中的特殊文件。需要注意的是:命名管道调用open()打开有可能会阻塞,但是如果以读写方式(O_RDWR)打开则一定不会阻塞;以只读(O_RDONLY)方式打开时,调用open()的函数会被阻塞直到有数据可读;如果以只写方式(O_WRONLY)打开时同样也会被阻塞,直到有以读方式打开该管道。

匿名管道只支持本地进程间进行数据通信;
命名管道支持网络进程间进行数据通信;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值