Linux学习通信阶段中 ftok msgget msgsnd msgrcv msgctl API相关介绍

ftok函数

系统建立IPC通讯,(消息队列、信号量和共享内存)时必须指定一个ID值。通常情况下,该ID值通过ftok函数得到。

#include <sys/types.h>
#include <sys/ipc.h>

key_t ftok(const char *pathname, int id);
pathname:指定的文件名(已经存在),一般使用当前目录
id:子序号。虽然是int类型,但是只是用8bits(1-255)

msgget函数

//创建或打开消息队列:成功返回队列ID,失败返回-1

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int msgget(key_t key, int msgflg);
key:函数返回值或IPC_PRIVATE
msgflg:IPC_CREAT创建新的消息队列

msgsnd和msgrcv函数

msgget函数:添加信息,成功返回0,失败返回-1
msgrcv函数:读取信息,成功返回消息数据的长度,失败返回-1

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid:消息队列识别码(ID)
msgp:指向信息缓冲区的指针,此位置用来暂时存储发送和接收,的消息,是一个用户可定义的通用结构
msgsz:消息的大小
msgflg:该参数是控制函数行为的标志,这里取值为0,表示忽略,如要用请自行查阅相关资料。

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
msqid:消息队列识别码(ID)
msgp:指向信息缓冲区的指针,此位置用来暂时存储发送和接收,的消息,是一个用户可定义的通用结构
msgsz:消息的大小
msgtyp:该参数是控制函数行为的标志,这里取值为0,表示忽略,如要用请自行查阅相关资料。
type == 0,返回队列中的第一个信息;
type > 0,返回队列中消息类型为type的第一个信息;
type < 0,返回队列中消息类型值小于或等于type绝对值的消息,如果有多个,则取类型值最小的信息。
msgflg:该参数是控制函数行为的标志,这里取值为0,表示忽略,如要用请自行查阅相关资料。

msgctl函数

控制消息队列,成功返回0,失败返回-1

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
msqid:消息队列识别码(ID)
cmd:
IPC_STAT:读取消息队列的数据结构msqid_ds,并将其存储在buf指定的地址中
IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm元素的值。这个值取自buf参数。
IPC_RMID:从系统内核中移走消息队列。
buf:这里设置为NULL,不做改变
/*********************读取代码*********************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>

struct msgbuf
{
        long mtype;
        char mtext[128];
};

int main()
{
        struct msgbuf readBuf;
        struct msgbuf sendBuf={999,"Thank you for respond"};

        key_t key;
        key = ftok(".",1);
        printf("key = %x\n",key);

        int getId=msgget(key,IPC_CREAT|0777);

        if(getId == -1){
                printf("get que failed\n");
        }

        msgrcv(getId,&readBuf,sizeof(readBuf.mtext),888,0);
        printf("read from que:%s\n",readBuf.mtext);

        msgsnd(getId,&sendBuf,strlen(sendBuf.mtext),0);

        msgctl(getId,IPC_RMID,NULL);
        return 0;
}
/*********************发送代码*********************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>

struct msgbuf
{
        long mtype;
        char mtext[128];
};

int main()
{
        struct msgbuf sendBuf = {888,"this is message que"};
        struct msgbuf readBuf;

        key_t key;
        key = ftok(".",1);
        printf("key = %x\n",key);

        int getId=msgget(key,IPC_CREAT|0777);

        if(getId == -1){
                printf("get que failed\n");
        }

        msgsnd(getId,&sendBuf,strlen(sendBuf.mtext),0);

        msgrcv(getId,&readBuf,sizeof(readBuf.mtext),999,0);
        printf("%s\n",readBuf.mtext);

        msgctl(getId,IPC_RMID,NULL);

        return 0;
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

智能轰炸机

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值