共享内存
来源:互联网 发布:手机淘宝上怎么给差评 编辑:程序博客网 时间:2024/05/01 11:18
/*
要运行程序,需要在当前目录下建立一个share文件,share是一个空文件,
没有任何意义,只是函数ftok需要一个文件名作参数,ftok另一个参数可以为任何数字。
程序运行后,分为父子进程,子进程申请共享内存,然后等待父进程继续执行,
父进程首先等待子进程申请到共享内存标识,然后输出共享内存中的内容,
为了演示共享内存可以随时更新,程序中在子进程里产生随机数写入共享内存供父进程读取。
代码如下:
*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<signal.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
int shmID;
char *buf;
void finalize(int signo)
{
shmctl(shmID,IPC_RMID,NULL);
exit(0);
}
int main()
{
int i = 1;
key_t shmKey;
signal(SIGINT,finalize);
signal(SIGTERM,finalize);
if(fork() == 0) //子进程
{
shmKey = ftok("share",16); //可以使用任何大于0的数字,如果名字和数相同,则产生的key相同。
if(shmKey == -1)
{
printf("创建key出错/n");
exit(-1);
}
shmID = shmget(shmKey,20,IPC_CREAT | IPC_EXCL | 0666);
if(shmID == -1)
{
printf("创建共享标识出错/n");
exit(-1);
}
sleep(2); //等待父进程执行,好显示第一行为空。
while(1)
{
buf = (char *)shmat(shmID,NULL,0);
srandom(time(NULL));
sprintf(buf,"%d",random());
shmdt(buf);
}
}
else //父进程
{
sleep(1); //让子进程先执行,以建立内存映射。
shmKey = ftok("share",16); //可以使用任何大于0的数字,如果名字和数相同,则产生的key相同。
if(shmKey == -1)
{
printf("创建key出错/n");
exit(-1);
}
shmID = shmget(shmKey,20,0); //0表示如果shmKey映射的不存在则报错。
if(shmID == -1)
{
printf("引用共享标识出错/n");
exit(-1);
}
while(1)
{
buf = (char *)shmat(shmID,NULL,0);
printf("%d. 现在共享内存中的内容为:%s/n",i++,buf);
shmdt(buf);
sleep(1);
}
}
return 0;
}
- 【共享内存】共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 每个新手都需要弄明白的问题
- 百分比的细节--容器背景图片篇
- poj比赛题1006
- 我的firefox插件
- 图的邻接矩阵实现(包括PRIM和DIJKSTRA算法)
- 共享内存
- 简单的页面时钟显示
- ASP.NET生成HTML页面
- SQL中CONVERT转化函数的用法,插入datetime类型
- 通用芯片和专用芯片之争
- 在开发WEB应用程序时, 如何提高WEB应用程序的性能. 主要把注意力集中在哪些地方..~~!
- 截然不同的for循环!
- 抽象类和接口的区别
- 拖动、关闭、打开DIV层