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值
msgflg:IPC_CREAT|0664
返回值:
成功:消息队列ID
失败:-1
(3)int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:发送消息队列的消息
参数:
msqid:消息队列ID
msgp:要发送的消息体
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:消息队列的id
cmd:操作方法:
IPC_STAT:获取状态操作
IPC_SET: 设置
IPC_RMID:删除操作
buf:
IPC_RMID :buff-》NULL
返回值:
成功:0
失败:-1
(5)ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
功能:从消息队列中接收消息
参数:
msqid:消息队列ID
msgp:要接受的消息的存储位置
msgsz:消息正文的大小
msgtyp:消息类型
msgflg:标志位:0:默认方式
返回值:
成功:返回实际消息正文的大小
失败:-1
(6)IPC对象命令
ipcs -a
查看系统中的IPC对象
ipcrm -q msgid
ipcrm -Q msgkey
删除消息队列
5)共享内存
共享内存:进程间效率最高的通信方式
利用内存映射技术,避免了数据的反复拷贝
int shmget(key_t key, size_t size, int shmflg);
功能:创建共享内存并获得共享内存的id
参数:
key:IPC对象key值
size:共享内存的大小(PAGE_SIZE(4096字节)整数倍)
shmflg:IPC_CREAT | 0664
返回值:
成功:共享内存的ID
失败:-1
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:建立共享内存和用户空间的内存映射
参数:
shmid:共享内存id
shmaddr:映射的用户空间首地址
NULL :由操作系统选择用户空间并以返回值的方式返回空间首地址
shmflg:
SHM_RDONLY :只读
!SHM_RDONLY :读写
返回值:
成功:映射的用户空间首地址
失败:(void *)-1
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:操作共享内存
参数:
shmid:共享内存id
cmd:操作指令
IPC_RMID:删除操作
buf:NULL
返回值:
成功:0
失败:-1
ipcs -a
查看IPC对象。
ipcrm -m shmid
ipcrm -M shmkey
删除共享内存
6)信号量集
信号量集(信号量数组):进程间同步