Linux--消息队列
迪丽瓦拉
2024-06-02 23:43:26
0

目录

一、线程和进程的概念

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
#include
#include
#include
#includestruct 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
#include
#include
#include
#includestruct mess
{long type;char data[128];
};int main()
{//得到idint 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,代表的含义是不区分消息队列,可以接收全部的消息。

上一篇:6.事件绑定指令 v-on

下一篇:编译器相关

相关内容