Linux-进程间通信和同步(1)-管道

半双工管道:

单向通信 ,shell 中 管道用 | 表示

$ ls -l|grep *.c  //把 ls -l 的输出当做 "grep *.c" 的输入

进程创建管道, 每次创建两个文件描述符来操作管道,成功返回 0 ,失败返回 -1

int pipe(int filedes[2]);
局限性:
  • 它是半双工的,即数据一个管道上的数据只能在一个方向上流动,如果要实现双向通信,就必须在两个进程之间建立两个管道;
  • 管道只能在具有公共祖先的两个进程之间使用;

pipe的实现机制:

管道是由内核管理的一个缓冲区,它的一端连接一个进程的输出,另一端连接一个进程的输入。管道的缓冲区不需要很大,它被设计为环形的数据结构,当两个进程都终止后,管道的生命周期也会被结束。

管道是一个固定大小的缓冲区,在Linux中,该缓冲区的大小为一页,即4kb,使它的大小不会像普通文件那样不加检验的增长。在Linux中,内核使用struct pipe_inode_info结构体来描述一个管道,这个结构体定义在pipe_fs_i.h中。


原子性:

当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。



--------------------------------------------分割线--------------

命名管道

1.创建 FIFO

shell 下创建

$ mkfifo /ipc/namedfifo

c语言

#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);





猜你喜欢

转载自blog.csdn.net/bobbymly/article/details/79326720
今日推荐