共享記憶體1.0(mmap函式)
阿新 • • 發佈:2018-12-21
#include"common.h"
int main()
{
int i,zero=1;
int *ptr=&zero;
if(fork()==0)
{
for(i=0;i<100;i++)
{
printf("child: %d\n",(*ptr)++);
}
exit(0);
}
for(i=0;i<100;i++)
{
printf("parent:%d\n",(*ptr)++);
}
exit(0);
}
在沒有使用共享記憶體的時候,輸出結果如下:
child: 89 parent:96 child: 90 parent:97 child: 91 parent:98 child: 92 parent:99 child: 93 parent:100 child: 94 child: 95 child: 96 child: 97 child: 98 child: 99 child: 100
使用共享記憶體:
#include"common.h" int main() { int fd,i,zero=1; int *ptr; sem_t *mutex; char buf[]="mysem"; fd=open("132.txt",O_RDWR|O_CREAT,0777); write(fd,&zero,sizeof(int)); //把zero寫到記憶體裡面去 ptr=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); //ptr接收被對映區的起始地址,在這裡相當於指向zero close(fd); //對映建立之後就可以關閉檔案 mutex=sem_open(buf,O_CREAT|O_EXCL,0666,1);//建立並初始化mysem訊號量 sem_unlink(buf); //自動刪除訊號量 setbuf(stdout,NULL);//關閉緩衝 if(fork()==0) { for(i=0;i<100;i++) { sem_wait(mutex);//相當於給訊號量上鎖 printf("child: %d\n",(*ptr)++); sem_post(mutex); //解鎖 } exit(0); } for(i=0;i<100;i++) { sem_wait(mutex); printf("parent:%d\n",(*ptr)++); sem_post(mutex); } exit(0); }
結果:
hild: 174 child: 175 child: 176 child: 177 child: 178 child: 179 child: 180 child: 181 child: 182 child: 183 parent:184 parent:185 parent:186 parent:187 parent:188 parent:189 parent:190 parent:191 parent:192 parent:193 parent:194 parent:195 parent:196 parent:197 parent:198 parent:199 parent:200