【IO】IPC通信机制函数(消息队列,共享内存,信号量集函数整理汇总)

        整理了一下IPC通信的函数,包括消息队列,共享内存,信号量集;信号量集的使用是在共享内存的基础上使用,函数太多啦,慢慢学吧cc,争取全部记住

        其中在使用有关信号量集的函数的时候,进行简单的封装函数功能之后,再进行使用,会更加方便,在文章最后对信号量集的两个进程通信进行代码展示。

目录

***********有关消息队列

1、ftok:创建用于生成消息队列的钥匙

2、msgget:通过钥匙创建出一个消息队列对象

3、msgsnd:向消息队列中存放消息

4、msgrcv:从消息队列中取消息

5、msgctl:控制消息队列

***********有关共享内存

1、shmget:创建共享内存对象

2、shmat:将共享内存地址映射到用户空间

3、shmdt:取消共享内存的映射

4、shmctl:共享内存的控制函数

***********有关信号量集

1、semget:创建一个信号量集

2、semctl:信号量集的控制函数

3、semop:对信号灯进行PV操作(申请资源和释放资源)

**信号量集函数展示


***********有关消息队列

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;         /*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值