1. 程式人生 > >共享記憶體1.0(mmap函式)

共享記憶體1.0(mmap函式)

#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