进程间的通讯方式

一、进程几种状态

1、运行态----进程占用CPU,并在CPU上运行;

2、就绪态----进程已经具备运行条件,但是CPU还没有分配过来;

3、阻塞态----进程因等待某件事发生而暂时不能运行;

 

二、进程间的几种通讯方式

1、信号量

 信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

2、消息队列

 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。

3、共享内存

  共享内存就是允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容

的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。

注意:共享内存没有任何的同步与互斥机制,所以要使用信号量来实现对共享内存的存取的同步。
所有的函数共用头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

1、创建共享内存——>shmget() 函数

int shmget(key_t key, size_t size, int shmflg);//成功返回共享内存的ID,出错返回-1

2、操作共享内存———>shmctl()函数

 int shmctl(int shm_id, int cmd, struct shmid_ds *buf);//成功返回0,出错返回-1

 3、挂接操作———>shmat()函数
 创建共享存储段之后,将进程连接到它的地址空间
 void *shmat(int shm_id, const void *shm_addr, int shmflg);//成功返回指向共享存储段的指针,出错返回-1

 4、分离操作———>shmdt()函数
该操作不从系统中删除标识符和其数据结构,要显示调用shmctl(带命令IPC_RMID)才能删除它

 int shmdt(const void *shmaddr);//成功返回0,出错返回-1

 

使用共享内存的优缺点
a、优点:我们可以看到使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,
也加快了程序的效率。同时,它也不像匿名管道那样要求通信的进程有一定的父子关系。
b、缺点:共享内存没有提供同步的机制,这使得我们在使用共享内存进行进程间通信时,往往要借助其他的手段来进行进程间的同步工作。
 
 
posted @ 2021-11-05 11:02  listxue  阅读(83)  评论(0编辑  收藏  举报