进程间通信(IPC):是指在不同进程之间传播或交换信息。
IPC的方式:通常有管道(无名管道、命名管道)、消息队列、信号量、共享存储、Socket、Streams等(Socket和Streams支持不同主机上的两个进程IPC)
进程间通信的目的:
1.数据传输:一个进程需要将它的数据发给另一个进程
2.资源共享:多个进程之间共享同样的资源
3.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发送了啥(如进程终止要通知父进程)
4.进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变
共享内存
共享内存就是允许两个或者多个进程共享一定的存储区,当一个进程改变了这块地址中的内容的时候,其他进程都会知道这个更改,因为数据直接写到内存中,不用多次复制,所以这是最快的进程间通信
共享内存没有同步互斥机制,在程序设计中应注意进程访问的同步问题,一般配合着信号量来实现共享内存的同步互斥
创建共享内存
#include<sys/ipc.h>
#include<sys/shm.h>
int shmget(key_t key,size_t size,int shmflg);
-key,共享内存的键值,与消息队列类似,可以由用户指定,也可以通过ftok函数生成,如果设置为IPC_RPIVATE,表示总是创建新的共享内存
-size,共享内存的大小,如果正在创建一块共享内存,必须设置此参数,如果正在打开一块已经存在的共享内存,可以将此参数设为0
-shmflg,创建共享内存时设定其存取权限
-返回值,函数执行成功后,返回共享内存的标识符,否则返回-1
控制共享内存
#include<sys/ipc.h>
#include<sys/shm.h>
struct shmid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};
int shmctl(int shm_id,int command,struct shmid_ds *buf);
-shmid,是shmget函数返回的共享内存标识符
-command,要采取的操作
IPC_STAT,把shmid_ds结构中的数据设置为共享内存的当前关联值
IPC_SET,如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中值
IPC_RMID,删除共享内存段
-buf,结构指针,指向共享内存模式和权限的结构
共享内存的读写
第一次创建共享内存时,它还不能被任何进程访问,shmat函数的作用就是来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
void* shmat(int shm_id,const void* shm_addr,int shmflg);
-shm_id,shmget函数返回的共享内存标识
-shm_addr,指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址
-shmflg,用来设定共享内存的访问权限,如果要求以只读方式访问,则是SHM_RDONLY
-返回值,成功时返回指向共享内存第一个字节的指针,失败时返回-1
shmdt函数用于将共享内存从当前进程中分离,将共享内存分离并不是删除它,只是使共享内存对当前进程不再可用。当一个进程终止时,它所映射的共享内存都会自动分离
#include<sys/ipc.h>
#include<sys/shm.h>
int shmdt(const void* shmaddr);
-shmaddr,shmat函数返回的地址
-返回值,成功时返回0,失败时返回-1
如果有什么不对的地方,可以评论告诉我,望指导!
本文详细介绍了进程间通信(IPC)的概念及其目的,包括数据传输、资源共享等。并深入探讨了IPC的各种方式,如管道、消息队列、信号量、共享存储、Socket等。重点讲解了共享内存的工作原理、创建及控制方法,以及如何进行读写操作。
949

被折叠的 条评论
为什么被折叠?



