首页 > 编程知识 正文

进程间通信的方式不包括(进程通信的概念及通信方式)

时间:2023-05-03 05:19:00 阅读:76985 作者:2875

进程间通信方式一般有以下几种。

1、管道、匿名管道、命名管道

2、信号

3、信号量

4、消息队列

5、共享内存

6 .插座

因为管线数据只沿一个方向流动,所以要实现双向通信,必须创建两条管线管道,将其分为匿名管道和命名管道。 命名管道只能在父子进程关系之间使用,也可以在两个不相关的进程之间使用。 这是因为可以创建管道类型的设备文件,并使用该设备文件进行通信。 管道上只有未格式化的字节流信号是过程之间唯一的异步通信机制。 信号的主要源主要是硬件源(键盘操作ctrl C )和软件源),诸如kill命令之类的信令相对较少,并且主要用于告知过程发生在某个时间。 例如,利用基尔PID,可以优雅地停止系统。

信号量是控制多个进程访问资源的计数器,通常充当锁定机制,防止一个进程访问共享资源,而另一个进程也不访问资源

消息队列的消息队列克服了信令信息少,管道只能承载未格式化的字节流,消息到达后放入,必要时去取。 与命名管道相比,消息队列的优点是它独立于发送和接收线程,因此可以消除同步命名管道打开和关闭时可能遇到的一些困难。

共享内存共享内存是指映射可以在进程之间共享的内存。 此内存由一个进程创建,但由于多个进程可以共享访问,因此是速度最快的进程间通信方式。 不需要从用户状态切换到内核状态。 这是专门为其他进程间通信方式低效运行而设计的。 经常与信号量等其他通信机构合作,实现进程间的同步和通信。

套接字套接字不仅可以用于本地进程的通信,还可以用于主机进程之间的通信。

关于管道:创建匿名管道需要以下系统调用:

intpipe(intFD[2]

这里创建了匿名管道,并返回了两个描述符,它们是管道的导入描述符

fd[0],另一个是管道的写入侧描述符fd[1]。 请注意,此匿名管道是一个特殊文件,只存在于内存中,不存在于文件系统中。

其实,管道是指内核中的一系列缓存。 从管道的某个段写入的数据实际上是在内核中缓存的,并从另一端读取。 也就是说,它是从内核读取的。 另外,管道传输的数据是无格式的流且大小受限

看到这一点,您可能会怀疑,这两个描述符都在一个进程中,而不是进程间通信。 管道是如何跨越两个过程的?

可以使用fork创建子进程。 创建的子进程复制父进程的文件描述符。 这允许两个进程分别有两个“fd[0]和fd[1]”,两个进程通过各自的fd写入和读取同一管道文件,从而实现进程之间的通信。

因为管道只能在一端写入,只能在另一端读出,所以上面的模式容易引起混乱。 这是因为父进程和子进程都可以同时写入和读取。 那么,为了避免这一点,通常的做法是:

父进程关闭读取的软盘[0],只保留写入的软盘[1];

子进程关闭已写入的软盘[1],只保留已读取的软盘[0];

所以说如果需要双向通信,则应该创建两个管道。

到目前为止,我们只分析了使用管道的父进程和子进程之间的通信,而不是在shell中。在 shell 里面执行 A | B命令的时候,A 进程和 B 进程都是 shell 创建出来的子进程,A 和 B 之间不存在父子关系,它俩的父进程都是 shell。

这意味着,在shell中通过名为“|”的匿名管道连接多个命令实际上是创建多个子进程。 创建shell脚本时,不要过多使用单个管道。 这样可以减少创建子进程的开销。

对于匿名管道,发现其通信范围是具有父子关系的过程。 因为管道没有实体,也就是说没有管道文件,所以只能通过fork复制父进程的fd文件描述符来达到通信的目的。

另外,关于命名管道,无关的进程之间也可以相互通信。 为了命令管道,预先创建了管道类型的设备文件,在流程中只需使用此设备文件即可相互通信。

无论是匿名管道还是命名管道,进程写入的数据都将缓存在内核中,其他进程读取数据时当然也会从内核中检索。 此外,通信数据遵循先进先出原则,不支持lseek这样的文件位置操作。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。