8.21 共享内存 消息队列
共享内存:两个进程可以同时使用的一块空间
ipcs可查看 (ipcs -m)
使用共享内存基本上一定会用信号量
共享内存示例代码:
int shmget(key_t key,size_t size,int shmflg); //创建共享内存
void* shmat(int shmid,const void *shmaddr,int shmflg); //链接进来 拿出指针
int shmdt(cont void *shmaddr); //移除指针 删除映射关系 断开链接
int shmctl(int shmid,int cmd,struct shmid_ds *buf); //传入销毁命令 销毁共享内存
(main.c)—输入
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/shm.h>
#include "sem.h"
int main()
{
int shmid = shmget((key_t)2121,128,IPC_CREAT|0600); //key_t , size , flg
if(shmid == -1)
{
printf("shmget err\n");
exit(0);
}
char* s = (char*)shmat(shmid,NULL,0);
if(s == (char*)-1)
{
printf("shmat err\n");
exit(0);
}
sem_init();
while(1)
{
char buff[128] = {0};
fgets(buff,128,stdin);
sem_p(SEM1); //p1
strcpy(s,buff);
sem_v(SEM2); //v2
if(strncmp(buff,"end,3") == 0)
{
break;
}
}
shmdt(s);
}
(test.c) —输出
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/shm.h>
#include "sem.h"
int main()
{
int shmid = shmget((key_t)2121,128,IPC_CREAT|0600);
if(shmid == -1)
{
printf("shmget err\n");
exit(0);
}
char * s = shmat(shmid,NULL,0);
if(s == (char*)-1)
{
exit(0);
printf("shmat err\n");
}
sem_init();
while(1)
{
sem_p(SEM2); //p2
if(trncmp(s,"end",3) == 0)
{
break;
}
printf("read:%s\n",s);
sem_v(SEM1);
}
shmdt(s);
sem_destory();
shmctl(shmid,IPC_RMID,NULL);
}
消息队列
定义一个消息队列可以写入消息、读取消息、接收消息
ipcs可查看
int msgget(key_y key,int msqflg); //构造消息队列
int msgsnd(int msqid,const void *msqp,size_t msqsz,int msqflg); //添加消息 指定消息队列
ssize_ msgrcv(int msqid,void *msgp,size_t msqsz,long msqtyp,int msqflg); //获取消息 给一个结构体 指定接收的消息类型
(msga.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
struct mess
{
long type;
char data[32];
};
int main()
{
//1.创建消息队列
int msgid = msgget((key_t)1234,IPC_CREAT|0600);
if(msgid ==-1)
{
printf("msgget err\n");
exit(0);
}
//添加消息
struct mess dt;
dt.type = 1; //1为消息类型 此时为1号消息
strcpy(dt.data,"hello1");
msgsnd(msgid,&dt,32,0);
}
(msgb.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
struct mess
{
long type;
char data[32];
};
int main()
{
int msgid = msgget((key_t)1234,IPC_CREAT|0600);
if(msgid ==-1)
{
printf("msgget err\n");
exit(0);
}
struct mess dt;
msgrcv(msgid,&dt,32,1,0); //1为消息类型 此时可读取1号消息 若想不限消息类型 可使其为0
printf("dt,data = %s\n",dt.data);
}