首页 > 编程知识 正文

六种进程间通信方式是,三种进程间通信方式

时间:2023-05-03 19:13:02 阅读:189170 作者:3246

进程间通信方式一共六种:

管道,信号量,信号,消息队列,共享内存,套接字。接下来,就一一学习理解下。

进程间通信的目的:

    数据传输:一个进程需要将它的数据发送给另一个进程
    资源共享:多个进程之间共享同样的资源
    通知事件:一个进程需要向另一个进程发送消息,通知其发生了某种事情(比如进程终止父进程告诉子进程)
    进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,能够及时知道它的状态改变。

进程间通信的分类:

    管道:匿名管道,命名管道
    System V IPC:消息队列,共享内存,信号量
    POSIX IPC:消息队列,共享内存,信号量,互斥量,读写锁,条件变量

1.管道又可分为:匿名管道、命名管道

管道是一种信息缓冲机制,Unix系统中管道基于文件系统,在内核中通过文件描述符表示,管道以先进先出的方式进行数据传输。

由于每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中看不到,所以进程之间进行交换数据必须通过内核中开辟的一块缓冲区,进程A把数据从用户空间拷贝到内核缓冲区,进程B再从缓冲区把数据读取走,内核提供的这种机制称为进程间的通信。

管道通信特点:

1)管道是一个单向通信信道,如果进程需要双向通信,一般需要定义两个管道。

2)管道通过系统调用read()、write()函数进行读写操作。

实现方法:

调用pipe()函数创建管道;

init pipe(int fd[2]),fd[0] 为管道的读取段,f[1]为管道的写入端。

通过write()函数写入信息,int write(int handle,char *buf,unsigned len);

进程通过read()函数读取数据 int read(int handle,void *buf,unsigned len)

匿名管道:只适用父子组件间的通信,管道能够将信息从一个进程的纸质空间拷贝到另一个进程空间。

匿名管道实现进程间通信的步骤:

*父组件创建管道,得到两个文件描述符指向管道的两端;

*父进程fork出 子进程,子进程也有两个文件  描述符 指向同一管道;

*父进程关闭fd[0], 子进程关闭fd[1],即父进程关闭管道读端,子进程关闭管道写端(因为管道只支持单向通信)。父进程可以往管道里写,子进程可以从管道里读,  管道式利用唤醒队列  实现的,数据从写端流入 从 读端 流出,这样实现进程间通信。

命名管道:命名管道有自己的名字和权限限制,就像一个文件一样,可以用于无亲缘关系进程间通信,进程通过管道名称获取管道。

方式:(粘至百度百科)

1) 文件和记录锁定。

为避免两个进程间同时要求访问同一共享资源而引起访问和操作的混乱,在进程对共享资源进行访问前必须对其进行锁定,该进程访问完后再释放。这是UNIX为共享资源提供的互斥性保障。

2)管道。

管道一般用于两个不同进程之间的通信。当一个进程创建一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样 提供了两个进程之间数据流动的一种方式。

3)FIFO。

FIFO是一种先进先出的队列。它类似于一个管道,只允许数据的单向流动。每个FIFO都有一个名字,允许不相关的进程访问同一个FIFO。因此也成为命名管。

4)消息队列。

UNIX下不同进程之间可实现共享资源的一种机制;UNIX允许不同进程将格式化的数据流以消息形式发送给任意进程。对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制。通过使用消息类型,进程可以按任何顺序读消息,或为消息安排优先级顺序。

5)信号灯。

作为进程间通讯的一种方法,它不是用于交换大批数据,而用于多进程之间的同步(协调对共享存储段的存取)。

6)共享内存。

通过信号灯实现存储共享(类似“红灯停、绿灯行”)

 

 

 

 

 

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