目录

一、线程和进程的概念

1.线程:

2.进程:

3.ipcs:

二、消息队列代码--写消息

//man msgget返回值问题

 //添加消息队列 man msgsnd

//运行代码 

//运行结果图

//进程和消息的状态

 三、消息队列代码--读消息

 //b.c读取消息

//执行b程序结果

 //读完全部消息继续读

 //解除阻塞


一、线程和进程的概念

 //可以有多个进程,至少有两个(一个读取一个写入,可以多个写入多个读入)

1.线程:

进程内部的一条执行路径(序列)

2.进程:

一个正在运行的程序

3.ipcs:

显示消息队列中都有哪些用户创建了消息队列

二、消息队列代码--写消息

//man msgget返回值问题

 //添加消息队列 man msgsnd

 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);//id,地址,数据大小,标志位

//运行代码 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>

struct mess
{
    long type;//长整形,代表消息类型
    char data[128];
};

int main()
{
    int msgid =msgget((key_t)1235,IPC_CREAT|0600);
    if(msgid==-1)
    {   
        exit(0);
    }   
    
    //将mess结构体添加到消息队列中
    struct mess dt; 
    dt.type=1;//大于等于1的数字,代表类型
    strcpy(dt.data,"hello1");
    msgsnd(msgid,(void*)&dt,128,0);
}

//运行结果图

//进程和消息的状态

a已经进程结束了,但是a进程创建的消息队列没有结束

 

 三、消息队列代码--读消息

 //b.c读取消息

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>

struct mess
{
    long type;
    char data[128];
};

int main()
{
    //得到id
    int msgid =msgget((key_t)1235,IPC_CREAT|0600);
    if(msgid==-1)
    {
        exit(0);
    }

    //获取消息
    struct mess dt; 
    msgrcv(msgid,(void*)&dt,128,1,0);//如果第四个数字为0,那什么类型的消息都可以接收,否则数字为几就接收哪种类型
    printf("read:%s\n",dt.data);//打印消息
}
~              

//执行b程序结果

读取消息,读一次消息- 1

 //读完全部消息继续读

此时已经将所有消息都读完了,如果继续读消息会阻塞

 //解除阻塞

再添加一个消息队列解除阻塞

b进程读不到a进程创建的消息

若a进程写入的是3号类型消息,b进程只能读1号类型的消息,那么a创建再多的消息,b也无法读到,会一直堵塞。

若想被b接收,可将类型改为0,代表的含义是不区分消息队列,可以接收全部的消息。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐