www.pudn.com > 操作系统pv操作.rar > M.cpp


#include  
#include  
 
//缓冲区和信号量 
HANDLE g_hBuffer = NULL; 
HANDLE g_hSemSynR = NULL, g_hSemSynM = NULL, g_hSemSynP = NULL; 
char* g_pszBuffer = NULL; 
//在缓冲区中的位置指针 
unsigned char g_nR = 0, g_nM = 0, g_nP = 0; 
 
//P,V操作 
void P(HANDLE hSem) 
{ 
	WaitForSingleObject(hSem, INFINITE); 
} 
 
void V(HANDLE hSem) 
{ 
	ReleaseSemaphore(hSem, 1, NULL); 
} 
 
void main() 
{ 
	//创建共享内存,大小为320 + 3B=10条记录 + 3个指针 
	g_hBuffer = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, 
		PAGE_READWRITE, 0, 323, "my_buffer"); 
	 
	if(g_hBuffer == NULL)// 如果创建失败 
	{   
		printf("创建或连接共享内存失败!\n"); 
		return;   
	} 
	else if(GetLastError() == ERROR_ALREADY_EXISTS) 
	{   //如果已经存在这个同名对象, 说明共享内存已经创建 
		g_pszBuffer = (char*)MapViewOfFile(g_hBuffer, FILE_MAP_WRITE | FILE_MAP_READ, 0,0,0); 
		unsigned char *pnPoint = (unsigned char*)g_pszBuffer; 
		g_nR = pnPoint[0]; 
		g_nM = pnPoint[1]; 
		g_nP = pnPoint[2]; 
	} 
	else  
	{   // 经过上面的检查, 说明这是第一次创建共享内存 
		g_pszBuffer = (char*)MapViewOfFile(g_hBuffer, FILE_MAP_WRITE | FILE_MAP_READ, 0,0,0); 
		// 初始化内存 
		memset(g_pszBuffer, 0, 323); 
		g_nR = g_nM = g_nP = 0; 
	} 
 
	//创建信号量 
	g_hSemSynR = CreateSemaphore(NULL, 10, 10, "my_sem_R"); 
	g_hSemSynM = CreateSemaphore(NULL, 0, 10, "my_sem_M"); 
	g_hSemSynP = CreateSemaphore(NULL, 0, 10, "my_sem_P"); 
 
	if(g_hSemSynR == NULL || g_hSemSynM == NULL || g_hSemSynP == NULL)	 
	{// 如果创建失败  
		printf("创建或连接信号量失败!\n"); 
		return;   
	} 
 
	//以上的代码对所有的程序都是一样的 
 
 
	//下面开始你自己的工作============================ 
	BOOL end = FALSE; 
	while(!end) 
	{ 
		char data[32]; 
		int x,i; 
		printf("\tP(synM)\n"); 
		P(g_hSemSynM); 
 
		g_nM = g_pszBuffer[1]; 
        strncpy(data, g_pszBuffer + 3 + g_nM * 32, 32); 
		//如果某个标点不是句号也不是逗号,则将其改为句号。 
        x=0; 
		for(i=1;i<=31;i++)  
		{//if(data[x]='\0')break; 
		if((data[x] < 'A' || data[x] > 'Z')&&(data[x] < 'a' || data[x] > 'z')&&(data[x] < '0' ||data[x] > '9')&&(data[x]!='.')&&(data[x]!=',')&&(data[x]!='\0')&&(data[x]!=' ')) 
			data[x]='.'; 
		x++; 
		} 
 
		//句子开头大写,并且大写转换成小写 
		if(data[0] >= 'a' && data[0] <= 'z')     
				   data[0] = data[0] - 32; 
		x = 1; 
		for(i=1;i<=31;i++)          
		{ 
			if(data[x] >= 'A' && data[x] <= 'Z')     
				   data[x] = data[x] + 32; 
			x++; 
		} 
 		x = 0; 
		 
		//句号后改成大写 
		for(i=0;i<=31;i++)  
		{ 
			if(data[x] == '.') 
				if(data[x+1] >= 'a' && data[x+1] <= 'z')     
				   data[x+1] = data[x+1] - 32; 
		    x++; 
		} 
		//多余的空格去掉 
		x=0; 
        for(i=0;i<=31;i++) 
		{   
			if(data[x]=='\0') break; 
			if(data[x] == ' '&&data[x+1]==' ') 
			{ 
				for(int j=x;j<=29;j++) 
				{ 
					data[j+1]=data[j+2]; 
				} 
				x--; 
			} 
			x++; 
		}	 
	 
		strncpy(g_pszBuffer + 3 + g_nM * 32, data, 32); 
		g_pszBuffer[1] = g_nM = (g_nM + 1) % 10; 
		printf("\t数据处理完毕\n");  
 
 
		printf("\tV(synP)\n"); 
		V(g_hSemSynP); 
 
		char endCH; 
		printf("Go on? "); 
		fflush(stdin); 
		scanf("%c", &endCH); 
		if(endCH != 'y' && endCH != 'Y' ) end = TRUE; 
	} 
 
	//自己的代码到此结束=========================== 
 
	UnmapViewOfFile(g_pszBuffer); 
	CloseHandle(g_hBuffer); 
	return; 
}