Linux进程间通信笔记

管道:

        父子进程可以通过创建的管道进行双向通信;进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其他进程从管道中移走数据之前,进程将一直阻塞。

有名管道:

        两个进程无法通过无名管道进行通信,但是通过有名管道可以实现不相关进程的数据交换。创建命名管道后,会在文件系统中生成一个管道文件。

       探究发现,如果open时没有使用O_NONBLOCK参数,我们发现不论读端还是写端先打开,先打开者都会阻塞,一直阻塞到另一端打开。(即是当运行程序的时候,不会打印open/write  is  success)

       出现的错误,if判断失败,改用while解决。

共享内存:

        管道会让用户空间和内核空间消耗大量的系统资源和系统时间。使用共享内存,让两个进程各自将自己用户空间尚未使用的一块虚拟地址映射到该公共物理地址内存。效率最高、速度最快。对于实现的API中如shmget中第一个参数,两个进程在调用的时候该参数必须一样才能确保使用的是同一块共享内存。

信号量:        

        在写进程和读进程没有同步的情况下,将导致读进程没有将数据读走之前,写进程又向共享内存写入了数据。在读进程和写进程同步进制的提供者就是信号量来实现的。

        两个信号量,readsem和writesem。readsem的初值是0,而writesem的初值是1.

       while(1){ P(writesem); write share memory;V(readsem);}写进程

       while(1){ P(readsem); read share memory;V(writesem);}读进程

      实现过程解释:初始化的时候,读信号量为0,写信号量为1.因此可以写,不可以读。

      开始在执行读进程的时候,会阻塞,写进程p操作获取信息1后置0,写入内存后唤醒读进程v操作,然后阻塞等待读进程读完内存。

      此时读进程p操作获得了写进程的唤醒操作,获取信息1后置0,读内存后唤醒写进程v操作,然后阻塞等待写进程写完内存。

      如此循环。

    出现的错误段错误 (核心已转储):解决办法,增大栈内存。http://imatlab.lofter.com/post/286ffc_a6ead7

消息队列:

        消息队列是消息的链表,存放在内核中并由消息队列标识符标识。每个消息包含一个正长整型的类型字段,以及实际的数据字节,在将消息添加到队列时会传送给msgsnd. msfrcv用于从队列中取消息。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值