唉。。。刚刚学了一个有名管道跟signal()函数,有要学习一个叫什么共享内存的东西,真是忒让人不省心啊!
mygod,怎么这么多系统函数啊!
下面,我们就通过一个小小的案例来说明一下shem()函数的使用吧。
它所在头文件:
#include
#include
int shmget(key_t key, size_t size, int shmflg);
对返回值及参数做一下简单的说明:
如果函数调用成功,则返回一个一个共享内存的id号,失败则返回-1
第一个参数是键值,通常通过ftok()函数多得,
第二个参数是设置共享内存的大小,可以自己一个1024的大小,也可以通过getpagesize()函数来获得一页的大小
第三个参数是权限位,可以设置内存的权限,如IPC_CREAT|IPC_EXCL|S_IRUSR| S_IWUSR| S_IRGRP|S_I
WGRP|S_IROTH|S_IWOTH,有不懂的权限,可以查看帮助手册哦!
如果要想连接访问一个共享内存,就必须知道内存的id号。
shemget()会返回一个内存的id号,其他的函数就可以通过对id号的操作来处理共享内存里面的数据啦!
亲,记得要导入相关文件哦!
下面看看第2个程序是怎么连接一个共享内存的吧!要深入理解每行代码哦!
#include
#include
#include
#include
#include
#include
int main()
{
int shmid;
int *addr;
int h,w;
float result;
while(1)
{
int i=0,j=0;
shmid=shmget(ftok("/etc/passwd",1001),getpagesize(),S_IRUSR| S_IWUSR| S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if(shmid==-1)
{
perror("shmget error:");
exit(EXIT_FAILURE);
}
addr=shmat(shmid,0,0);
j=*(addr+2);
w=*(addr+1);
h=*addr;
result=w/(h*h/10000);
if(i
{
if(result>25)
{
printf("胖拉!\n");
*(addr+2)=0;
}
else if(result<20)
{
printf("瘦啦!\n");
*(addr+2)=0;
}
else
{
printf("正常!\n");
*(addr+2)=0;
}
}
shmdt(addr);
}
}
为了实现反复循环的打印,我加了一个while语句,通过if做了一个条件的判断,如果i
其实打印这个不是目的,主要就是要学会怎么去创建一个共享内存和链接一个共享内存。
这只是对共享内存的访问,想要创建看另一篇博文!