11月26日:操作系统实验杂记 msgget(创建消息队列) msgsnd(发送消息) msggrcv(接收消息) msgctl(控制消息队列)

文章目录

  • 函数语法介绍
    • 序:消息结构体
    • 1.创建消息队列msgget
    • 2.发送消息msgsnd
    • 3.接收消息msgrcv
    • 4.控制消息队列msgctl
  • 函数应用实例

函数语法介绍

注意:下面介绍的函数都需要导入头文件

序:消息结构体

①“消息”结构体是一个需要用户自行定义的结构体,但是必须满足一定的格式;
②该结构体中只能有两个成员,分别是long类型的mtype用于表示消息的类型,以及char[]类型的mtext表示消息的文本,定义方式如下:

struct msgform
{
    long mtype;           //消息类型
    char mtext[消息长度] ; //消息文本
}msg;

1.创建消息队列msgget

函数伪定义:

int msgqid=msgget(key,flag)

①msgget函数用于创建一个消息队列。
②key参数用于区分不同的消息队列,用一个整数表示。

③flag是用户设置的标志和访问方式。常用的参数为IPC_CREAT|0400(表示如果该消息队列已经存在则打开这个消息队列,否则创建这个名称的消息队列)。
④返回值:表示消息队列的编号,如果返回-1则表示创建消息队列失败。

2.发送消息msgsnd

函数伪定义:

void msgsnd(msgqid,msgp,size,flag)

①msgsnd函数用于向消息队列中发送一条消息,排在消息队列尾部。
②msgqid参数表示消息队列的编号(msgget函数的返回值即为生成的消息队列的编号);
③msgp参数表示一个指向“消息”结构体的指针。
④size表示指向的消息结构体中消息的长度(以字节为单位)。
⑤flag一般设置为0。

3.接收消息msgrcv

函数伪定义:

void msgrcv(msgqid,msgp,size,type,flag)

①msgrcv函数用于从消息队列的队头取出一条信息。
②msgp表示指向一个消息结构体的指针。
③size表示消息结构体中消息的长度(以字节计算)。
④type和flag一般都设置为0。

4.控制消息队列msgctl

函数伪定义:

void msgctl(msgqid,cmd,buf)

①msgqid表示需要操作的消息队列编号;
②cmd表示操作类型,最常用的参数是删除消息队列参数:IPC_RMID
③buf一般置为0。

函数应用实例

题目内容:假设有2个用户lucy和peter, 使用消息队列进行通信,Lucy先发言,实现2人之间的聊天功能。当任意一方输入quit时,停止通信,程序结束。

Lucy进程代码

#include
#include
#include
struct msgform
{
    long mtype;
    char mtext[1024];
}m;

int isQuit(char* p)
{
    if(p[0]=='q'&&p[1]=='u'&&p[2]=='i'&&p[3]=='t')
    {
        return 1;
    }
    else return 0;
}

int main(void)
{
    m.mtype=1;
    int qid=msgget(12345,IPC_CREAT|400);
    while(1)
    {
        printf("Lucy:");
        scanf("%s",m.mtext);
        if(isQuit(m.mtext)==1)
        {
            printf("\n聊天结束。\n");
            msgctl(qid,IPC_RMID,0);
            exit(1);
        }
        msgsnd(qid,&m,1024,0);
        msgrcv(qid,&m,1024,2,0);
        printf("Peter:%s\n",m.mtext);
        m.mtype=1;
    }
    return 0;
}

Peter进程代码

#include
#include
#include
struct msgform
{
    long mtype;
    char mtext[1024];
}m;

int isQuit(char* p)
{
    if(p[0]=='q'&&p[1]=='u'&&p[2]=='i'&&p[3]=='t')
    {
        return 1;
    }
    else return 0;
}


int main(void)
{
     m.mtype=2;
     int qid=msgget(12345,IPC_CREAT|400);
     while(1)
     {
         msgrcv(qid,&m,1024,1,0);
         printf("Lucy:%s\n",m.mtext);
         m.mtype=2;
         printf("Peter:");
         scanf("%s",m.mtext);
         if(isQuit(m.mtext)==1)
         {
             printf("\n聊天结束。\n");
             msgctl(qid,IPC_RMID,0);
             exit(1);
         }
         msgsnd(qid,&m,1024,0);
     }
    return 0;
}

运行效果
11月26日:操作系统实验杂记 msgget(创建消息队列) msgsnd(发送消息) msggrcv(接收消息) msgctl(控制消息队列)_第1张图片

你可能感兴趣的:(操作系统,c语言)