目录
一、线程和进程的概念
//可以有多个进程,至少有两个(一个读取一个写入,可以多个写入多个读入)
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,代表的含义是不区分消息队列,可以接收全部的消息。