⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m.cpp

📁 这是一个操作系统的p,v操作的程序,其中还包含了执行结果和一份课程设计报告,请斑竹查收^_^
💻 CPP
字号:
#include <stdio.h>
#include <Windows.h>

//缓冲区和信号量
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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -