整理了一下IPC通信的函数,包括消息队列,共享内存,信号量集;信号量集的使用是在共享内存的基础上使用,函数太多啦,慢慢学吧cc,争取全部记住
其中在使用有关信号量集的函数的时候,进行简单的封装函数功能之后,再进行使用,会更加方便,在文章最后对信号量集的两个进程通信进行代码展示。
目录
***********有关消息队列
1、ftok:创建用于生成消息队列的钥匙
函数原型:
key_t ftok(const char *pathname, int proj_id);
例子:
//1、创建key值,用于生产消息队列
key_t key = ftok("/", 'k');
参数1:文件路径,该文件的inode号占key值的2字节,该文件的设备号占key值的1字节
参数2:一个给定的随机值,该值占key值的1字节
功能:通过给定的文件路径和一个随机ID值创建出一个用于IPC通信的key值
返回值:成功返回创建出的key值,失败返回-1并置位错误码
2、msgget:通过钥匙创建出一个消息队列对象
函数原型:
int msgget(key_t key, int msgflg);
/*
参数1:用于创建消息队列的key值,该值可以由ftok创建出来,也可以是 IPC_PRIVATE,表示进行亲缘进程间的通信
参数2:创建标识位
IPC_CREAT:表示本次操作要创建一个消息队列,如果该key值对应的消息队列已经存在,则直接打开该消息对象
IPC_EXCL:表示本次确保要创建一个新的消息队列,如果该消息队列已经存在,则该函数报错,错误码为EEXIST 创建文件的权限,也在该参数中,使用位或连接
*/
例子:
功能:通过给定的key值创建一个消息队列
返回值:成功返回消息队列的id号,失败返回-1并置位错误码
3、msgsnd:向消息队列中存放消息
函数原型:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
例子:
//3、将消息发送到消息队列中
msgsnd(msqid, &buf, SIZE, 0);
/*
参数1:消息队列的id号
参数2:是指向封装好的消息的起始地址,通常类型如下,但是需要用户自己定义
struct msgbuf {
long mtype;
char mtext[1];
};
参数3:表示参数2中,消息正文的大小,不包含消息类型的大小
参数4:发送标识位,表示是否阻塞
0:表示阻塞
IPC_NOWAIT:表示非阻塞
*/
功能:向消息队列中存放消息,要求当前进程对消息队列具有可写权限
返回值:成功返回0,失败返回-1并置位错误码
4、msgrcv:从消息队列中取消息
函数原型:
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
例子:
msgrcv(msqid, &buf, SIZE, 0, 0);
//参数1:消息队列id号
//参数2:数据容器起始地址
//参数3:数据的正文大小
//参数4:消息类型,0表示任意类型
//参数5:表示阻塞读取消息
功能:从消息队列中取消息
返回值:成功返回成功读取的字节个数,失败返回-1并置位错误码
5、msgctl:控制消息队列
函数原型:
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
例子:
//删除消息队列
if(msgctl(msqid, IPC_RMID, NULL) ==-1)
{
perror("msgctl error");
return -1;
}
// 参数1:消息队列的id号
// 参数2:操作指令
// IPC_STAT:获取消息队列的属性,此时参数3必须要给定,表示接收消息队列的属性
// struct msqid_ds {
// struct ipc_perm msg_perm; /* 拥有者和权限 */
// time_t msg_stime; /* 最新一次向消息队列中发送数据的时间 */
// time_t msg_rtime; /* 最新一次消息队列接受数据的时间 */
// time_t msg_ctime; /* 最新一次操作消息队列的时间 */
// unsigned long __msg_cbytes; /* 当前队列中已用的字节数 */
// msgqnum_t msg_qnum; /* 当前队列中消息的个数*/
// msglen_t msg_qbytes; /* 队列的最大容量,默认是16K */
// pid_t msg_lspid; /* 最后一次向消息队列中发送消息的进程id号 */
// pid_t msg_lrpid; /* 最后一次从消息队列中取消息的进程id号 */
// };
// 对第一个成员的介绍
// struct ipc_perm {
// key_t __key; /* 键值 */
// uid_t uid; /* 当前拥有者的用户id号 */
// gid_t gid; /*