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; }