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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用系统调用msgget(),msgsnd(),msgrcv(),及msgctl()等编制一个长度为1k的消息的发送和接收程序的示例代码: 发送程序: ```c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> #define MSG_SIZE 1024 struct msgbuf { long mtype; char mtext[MSG_SIZE]; }; int main() { key_t key; int msgid; struct msgbuf msg; key = ftok(".", 'a'); msgid = msgget(key, IPC_CREAT | 0666); if (msgid < 0) { perror("msgget"); exit(1); } msg.mtype = 1; strcpy(msg.mtext, "Hello, World!"); if (msgsnd(msgid, &msg, strlen(msg.mtext) + 1, 0) < 0) { perror("msgsnd"); exit(1); } printf("Message sent: %s\n", msg.mtext); return 0; } ``` 接收程序: ```c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> #define MSG_SIZE 1024 struct msgbuf { long mtype; char mtext[MSG_SIZE]; }; int main() { key_t key; int msgid; struct msgbuf msg; key = ftok(".", 'a'); msgid = msgget(key, IPC_CREAT | 0666); if (msgid < 0) { perror("msgget"); exit(1); } if (msgrcv(msgid, &msg, MSG_SIZE, 1, 0) < 0) { perror("msgrcv"); exit(1); } printf("Message received: %s\n", msg.mtext); if (msgctl(msgid, IPC_RMID, NULL) < 0) { perror("msgctl"); exit(1); } return 0; } ``` 在发送程序,首先使用ftok()函数生成一个IPC键值,然后使用msgget()函数创建一个消息队列。接着定义一个msgbuf结构体,其mtype成员表示消息类型,mtext成员表示消息内容。将要发送的消息内容复制到msgbuf结构体的mtext成员,然后使用msgsnd()函数将消息发送到消息队列。最后打印出发送的消息内容。 在接收程序,首先使用ftok()函数生成一个IPC键值,然后使用msgget()函数创建一个消息队列。接着定义一个msgbuf结构体,然后使用msgrcv()函数从消息队列接收消息。msgtype参数指定要接收的消息类型,这里设置为1。如果成功接收到消息,则打印出消息内容。最后使用msgctl()函数删除消息队列。 控制消息队列的系统调用包括msgget()、msgsnd()、msgrcv()和msgctl()。其msgget()用于创建或访问一个消息队列,msgsnd()用于将消息发送到消息队列msgrcv()用于从消息队列接收消息,msgctl()用于控制消息队列。这些系统调用都是通过IPC键值来访问消息队列的。在使用这些系统调用时,需要注意设置正确的消息类型和消息长度,以确保消息能够正确发送和接收。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值