共享内存:最为高效的进程间通信方式,进程可以直接读写内存,不需要任何数据的拷贝
为了在多个进程间交换信息,在内核中专门有一块内存区,可以有需要访问的进程将其映射到自己的私有地址空间
//步骤
A:
1.ftok(".",int a) //生成一个标识,flag --->B进程通过该flag找到A进程
2.shmget
3.shmat
4.memcpy
B:
1.ftok(找到A进程)
2.shmget(找共享内存ID号)
3.shmat
4.printf()//直接拿数据用
//ftok
key_t ftok(const char *pathname,int proj_id);
//作用:生成对方仅称找到自己的标志符
//参数1:用户指定的路径,可以是"."(相对路径)或"/home/linux"(绝对路径)
//参数2:一个整数,范围0~255
//返回值:成功返回key值,key值是唯一的,失败返回-1
//shmget
int shmget(key_t key,int size,int shmflg);
//作用:生成一块共享内存
//参数1:IPC_PRIVATE或ftok的返回值
//参数2:共享内存区的大小
//参数3:同open函数的权限位,也可以用8进制表示
//返回值:成功返回shmid-->共享内存段标识符,错误返回-1
//shmat
void *shmat(int shmid,const void *shmaddr,int shmflg);
//作用:将本地内存和共享内存建立映射
//参数1:要映射的共享内存区标识符,shmget的返回值
//参数2:指向本地内存地址的指针,一般给NULL(若为NULL,则表示由系统自动完成映射)
//参数3:SHM_RDONLY--->共享内存只读,默认0--->共享内存可读写
//返回值:void*指针指向映射成功后的本地内存的地址
//memcpy
//格式:memcpy(aim,str,n)
//参数:将str字符串的前n个字符复制到aim中。
//shmdt
int shmdt(const void *shmaddr);
//作用:取消映射
//参数:映射成功后的本地内存地址,shmat的返回值
//shmctl
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
//作用:设置或获取共享内存属性
//参数1:共享内存的标识符 shmget的返回值
//参数2:操作选项 IPC_STAT(获取对象属性)
// IPC_SET(设置对象属性)
// IPC_RMID(删除对象)
//参数3:指向共享内存的属性值,IPC_STAT或IPC_SET时使用,IPC_RMID时该值为NULL
消息:要传递信息的目标载体
队列:先进先出,数据放到队列中
通过消息队列实现数据的通信
多条消息放到队列中
//步骤
A进程---发消息
1 ftok-->得到一个key值让对方进程找到
2 msgget
3 创建消息结点
4 msgsnd发消息
B进程---收消息
1 ftok
2 msgget
3 msgrecv(取消息)
//msgget
int msgget(key_t key,int msgflg);
//作用:创建一个消息队列
//参数1:ftok的返回值
//参数2:IPC_CREAT|消息队列的访问权限
//返回值:成功返回消息队列ID,失败返回-1
消息结点:一般由消息类型和消息正文组成
struct msgbuf
{
long m_tyoe;//消息类型
char buf[BUF_SIZE];//消息正文,BUF_SIZE为消息大小
}
//msgsnd
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg)
//作用:给消息队列发消息
//参数1:消息队列的ID
//参数2:指向消息结构体的指针
//参数3:消息正文的大小
//参数4:IPC_NOWAIT 消息没有发送完成函数也会理解返回;0 直到发送完才返回
//返回值:成功0,失败-1
//msgrcv
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg)
//作用:从消息队列中读消息
//参数1:消息队列的ID
//参数2:指向存放消息结构体
//参数3:消息正文的大小
//参数4:收消息的类型 0:接收消息队列中的第一个消息
大于0:接收消息队列中第一个类型为msgtyp的消息
小于0:接受消息队列中类型值大于等于msgtyp的绝对值且类型值又最小的消息
//参数5:IPC_NOWAIT 消息没有发送完成函数也会理解返回;0 直到发送完才返回
//返回值:成功 期望接收到的消息的长度而非实际收到消息的长度,失败-1