Linux-进程间通讯-管道

进程间通讯:

A进程怎样将“hello world”传递给B进程:

I:利用文件实现:需要一个“中间人”进行传递 --- 文件(在磁盘中存储),A先调用open函数打开文件,再用write函数写文件,B用read函数读取文件,但问题如下:

     1.如果A发送了数据B进行了接收,但A的数据没有被清空

     2.如果A发送了数据B接收了,但A并没有在文件中写入数据,而B进程也没有发生阻塞

     3.读取文件使用i/o操作,耗费时间

所以,文件不适合进程之间的交互。

II:可用

    在进行管道-信号量-消息队列后,A进程发送的文件会自动清空,并且B进程读取文件时发现文件为空时会发生阻塞,停止接收,直到文件不为空

    1.管道

      管道通信原理:在内存上开辟一个空间,A、B进程都通过文件描述符操作这块空间,以完成交互的功能(两个进程不会有交集)

      管道文件:仅仅是目录树中的一个表示,并不在磁盘中占据空间。

      1.1 有名管道

             特性:有名字的管道,可以在任意两个进程间传递数据

             创建:mkfifo命令  和  mkfifo()函数  进行创建

             使用:打开 open(路径+文件名,O_WRONLY)只写打开

                       写数据  write(open的返回值,内容,长度)

                       读取文件  read(open的返回值,buff,长度127)

                       关闭  close(open的返回值)

             特点:(1) 如果进程以只写操作打开管道,并且没有以只读或者读写打开这个管道的另一个进程,则打开操作会阻塞,直到有进程以只读或读写打开这个管道,open才会返回。

                        (2) 如果进程以只读或者读写打开管道,并且没有以只写操作打开这个管道的另一个进程,则打开操作会阻塞,直到有进程以只写打开这个管道,open才会返回。

                        (3) 当写端没有写入数据时,读端会阻塞read调用,直到写端写入数据。

                        (4) 当管道没有空间时,再写入数据就会被阻塞,直到有进程读取数据,或者所有读端关闭(当完成数据交换时,A进程会自动清空数据)

      1.2 无名管道

    2. 信号量

    3. 消息队列

    4. 共享内存

III:扩展内容

    1. 管道大小?怎样修改管道大小?

练习:A进程接收用户收入,B进程统计用户输入的字符个数,当用户输入end结束,并且end不计入字数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值