(消息队列)(共享内存))
4)消息队列system V IPC对象消息队列1.将进程间通信的数据封装成消息体发送2.增加消息类型可以根据消息的类型设置数据的优先级。1.获取IPC的key值ftok();2.创建消息队列 msgget();3.发送消息队列消息: msgsnd();4.接收消息队列消息 :msgrcv();5.删除消息队列 : msgctl();(1)key_t ftok(const char *pathname, int proj_id);功能产生一个IPC对象key值参数pathname路径名proj_id项目id返回值成功key值失败-1(2)int msgget(key_t key, int msgflg);功能根据key值创建一个消息队列参数key IPC key值msgflgIPC_CREAT|0664返回值成功消息队列ID失败-1(3)int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);功能发送消息队列的消息参数msqid消息队列IDmsgp要发送的消息体struct msgbuf {long mtype; /* message type, must be 0 */ 消息类型char mtext[1]; /* message data */ 消息正文};msgsz消息正文大小msgflg标志位0默认方式发送返回值成功0失败-1(4)int msgctl(int msqid, int cmd, struct msqid_ds *buf);功能操作IPC对象对应的消息队列参数msqid消息队列的idcmd操作方法IPC_STAT:获取状态操作IPC_SET: 设置IPC_RMID:删除操作bufIPC_RMID buff-》NULL返回值成功0失败-1(5)ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);功能从消息队列中接收消息参数msqid消息队列IDmsgp要接受的消息的存储位置msgsz消息正文的大小msgtyp消息类型msgflg标志位0默认方式返回值成功返回实际消息正文的大小失败-1(6)IPC对象命令ipcs -a查看系统中的IPC对象ipcrm -q msgidipcrm -Q msgkey删除消息队列5)共享内存共享内存进程间效率最高的通信方式利用内存映射技术避免了数据的反复拷贝int shmget(key_t key, size_t size, int shmflg);功能创建共享内存并获得共享内存的id参数keyIPC对象key值size共享内存的大小PAGE_SIZE4096字节整数倍shmflgIPC_CREAT | 0664返回值成功共享内存的ID失败-1void *shmat(int shmid, const void *shmaddr, int shmflg);功能建立共享内存和用户空间的内存映射参数shmid共享内存idshmaddr映射的用户空间首地址NULL 由操作系统选择用户空间并以返回值的方式返回空间首地址shmflgSHM_RDONLY :只读SHM_RDONLY 读写返回值成功映射的用户空间首地址失败void *-1int shmctl(int shmid, int cmd, struct shmid_ds *buf);功能操作共享内存参数shmid共享内存idcmd操作指令IPC_RMID删除操作bufNULL返回值成功0失败-1ipcs -a查看IPC对象。ipcrm -m shmidipcrm -M shmkey删除共享内存6)信号量集信号量集信号量数组进程间同步