本文主要是介绍100_进程通信_使用共享内存,发布通知(10条)给到3个进程【向共享内存写、读,创建的消息队列键值,必须一致,打开同一块共享内存】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
动图:
往共享内存写东西:
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/shm.h>
#include <unistd.h>
int main()
{
key_t key = ftok("./", 2101);
if(key != -1)
{
printf("key = %d\n", key);
}
//创建、打开共享内存
int shmiod = shmget(key, 512 ,IPC_CREAT | 0666);
if(shmiod != -1)
{
printf("shmiod = %d\n", shmiod);
}
//为共享内存,建立映射
char *str_add = (char *)shmat(shmiod, NULL, 0);
//=============== 向共享内存建立映射的地址上'写'东西 =============================//
int i = 0;
char buf[123] = "";
while(1)
{
sleep(2);
sprintf(buf, "this is %d mesg", i);
strcpy(str_add, "hello word");
i++;
}
sleep(3);
shmdt(str_add);
//删除共享内存
int shmidctl = shmctl(shmiod, IPC_RMID, NULL);
if(shmidctl != -1)
{
printf("删除成功\n");
}
return 0;
}
从共享内存读东西:
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/shm.h>
#include <unistd.h>
int main()
{
key_t key = ftok("./", 2101);
if(key != -1)
{
printf("key = %d\n", key);
}
//创建、打开共享内存
int shmiod = shmget(key, 512 ,IPC_CREAT | 0666);
if(shmiod != -1)
{
printf("shmiod = %d\n", shmiod);
}
//为共享内存,建立映射
char *str_add = (char *)shmat(shmiod, NULL, 0);
pid_t pid;
int i = 0;
for(; i < 3; i++)
{
pid = fork();
if(pid == 0)
{
break;
}
}
if(0 == i)
{
//================== 从共享内存建立映射的地址上读str_add =================================//
int x = 0;
while (1)
{
sleep(1);
if(str_add != NULL)
{
printf("子进程 1 第 %d 映射地址建立成功:%s\n", x, str_add);
}
x++;
if(x == 10)
{
printf("映射信息不在接收-退出\n");
break;
}
}
}
else if(1 == i)
{
int x = 0;
while (1)
{
sleep(1);
if(str_add != NULL)
{
printf("子进程 2 第 %d 映射地址建立成功:%s\n", x, str_add);
}
x++;
if(x == 10)
{
printf("映射信息不在接收-退出\n");
break;
}
}
}
else if(2 == i)
{
int x = 0;
while (1)
{
sleep(1);
if(str_add != NULL)
{
printf("子进程 3 第 %d 映射地址建立成功:%s\n", x, str_add);
}
x++;
if(x == 10)
{
printf("映射信息不在接收-退出\n");
break;
}
}
}
else
{
while (1)
{
pid = waitpid(-1, NULL, WNOHANG);
if(pid > 0)
{
printf("回收的子进程号:%d\n",pid);
}
else if(pid == 0)
{
continue;
}
else
break;
}
}
sleep(2);
shmdt(str_add);//解除映射
//删除共享内存
int shmidctl = shmctl(shmiod, IPC_RMID, NULL);
if(shmidctl != -1)
{
printf("删除成功\n");
}
return 0;
}
这篇关于100_进程通信_使用共享内存,发布通知(10条)给到3个进程【向共享内存写、读,创建的消息队列键值,必须一致,打开同一块共享内存】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!