进程间通信
(1)消息队列
ipcs查看所有ipc对象的信息,
消息队列可以接收不同类型的消息;
来看下具体内容:
1.创建IPC对象名称
key_t ftok(const char *pathname, int proj_id);
功能:
创建一个IPC对象名称
参数:
pathname:文件的路径
proj_id:项目ID(8bits)
返回值:
成功返回IPC对象名称
失败返回-1
2.创建消息队列
int msgget(key_t key, int msgflg);
功能:
创建一个消息队列
参数:
key:IPC对象名称
msgflg:消息队列属性
IPC_CREAT:创建一个消息队列
IPC_EXCL: 如果消息队列存在就报错
返回值:
成功返回消息队列ID
失败返回 -1
3.发送消息
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:
向消息队列中发送消息
参数:
msqid:消息队列的ID号
msgp:发送消息的内容
msgsz:发送消息的大小
msgflg:消息属性 默认为0
返回值:
成功返回0
失败返回-1struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
4.接收消息
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
功能:
从消息队列中接收消息
参数:
msqid:消息队列的ID号
msgp:存放消息的空间首地址
msgsz:最多接收消息的大小
msgtyp:接收消息的类型
msgflg:消息属性 默认为0
返回值:
成功返回接收到数据的字节数
失败返回-1
5.消息队列销毁
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
功能:
向消息队列发送命令
参数:
msqid:消息队列的ID号
cmd:命令
IPC_STAT:获取消息队列的信息
返回值:
成功返回0
失败返回-1
(2)共享内存
1.创建 key 值
2.创建共享内存
int shmget(key_t key, size_t size, int shmflg);
功能:
创建一个共享内存
参数:
key:IPC对象名称
size:共享内存的大小
shmflg:
IPC_CREAT 创建
IPC_EXCL 如果存在就报错
返回值:
成功返回共享内存ID号
失败返回-1
3.映射共享内存
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:
将地址映射到共享内存中
参数:
shmid:共享内存ID号
shmaddr:
NULL: 让系统选择一个合适的地址映射到共享内存中
shmflg:
属性,默认为0
返回值:
成功返回映射到共享空间的地址
失败返回NULL
4.解除映射
int shmdt(const void *shmaddr);
功能:
解除映射空间
参数:
shmaddr:映射到共享内存中的地址
返回值:
成功返回0
失败返回-1
5.销毁共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:
向共享内存发送命令
参数:
shmid:共享内存ID号
cmd:命令
IPC_RMID 删除
返回值:
成功返回0
失败返回-1
(3)信号灯
1.创建信号灯
int semget(key_t key, int nsems, int semflg);
功能:
创建信号量数组
参数:
key:IPC对象名称
nsems:信号量个数
semflg:信号量属性
IPC_CREAT:创建一个信号量数组
返回值:
成功返回0
失败返回-1
2.向信号灯发送命令
int semctl(int semid, int semnum, int cmd, ...);
功能:
向信号灯发送命令
参数:
IPC_RMID 删除信号灯
SETVAL 设置第semnum-th信号量的值为arg.val
返回值:
成功返回0
失败返回-1
3.对信号量完成申请和释放操作
int semop(int semid, struct sembuf *sops, size_t nsops);
功能:
对信号量完成申请和释放操作
参数:
semid:信号灯ID号
sops:信号灯操作数组
unsigned short sem_num; //操作信号量的下标
short sem_op; //对信号量的操作 +1(释放信号量) -1(申请信号量)
short sem_flg; //SEM_UNDO 操作结束后,信号量的值会恢复到原来的值
nsops:数组元素个数
返回值:
成功返回0
失败返回-1