📄 进程m.txt
字号:
//进程M
#include <stdio.h>
#include <Windows.h>
#include<ctype.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; }
//以上的代码对所有的程序都是一样的
//下面开始M的工作
BOOL end = FALSE;
while(!end)
{int i;
char data2[32];
printf("***数据处理***\n");
printf("\tP(synM)\n");
P(g_hSemSynM);
g_nM = g_pszBuffer[1];
strncpy(data2, g_pszBuffer + 3 + g_nM * 32, 31);
int x=0;
for(i=1;i<=31;i++)
{ if((data2[x] < 'A' || data2[x] > 'Z')&&(data2[x] < 'a' || data2[x] > 'z')&&(data2[x] < '0' ||data2[x] > '9')&&(data2[x]!='.')&&(data2[x]!=',')&&(data2[x]!='\0')&&(data2[x]!=' '))
data2[x]='.';
x++;}
//以上是如果某个标点既不是句号,也不是逗号,则将其改为句号。 data2[0]=toupper(data2[0]);
for(i=1;i<sizeof(data2);i++)
{data2[i]=tolower(data2[i]);}
for(i=1;i<sizeof(data2);i++)
{if(data2[i]=='.'&&data2[i+1]>='a'&&data2[i+1]<='z')
data2[i+1]=toupper(data2[i+1]);}
//以上是将所有大写字母转换为小写字母(但每个句子的第一个字母应该大写
x=0;
for( i=0;i<=31;i++)
{if(data2[x]=='\0')
break;
if(data2[x]==' '&&data2[x+1]==' ')
{for(int j=x;j<=29;j++)
{data2[j+1]=data2[j+2];}
x--;
}
x++;
}
//以上是去掉单词之间、句子与句子之间多余的空格
printf("处理后的数据:%s\n", data2);
strncpy(g_pszBuffer + 3 + g_nM * 32,data2 , 31);
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;}
//M的工作到此结束
UnmapViewOfFile(g_pszBuffer); //断开和共享内存的连接
CloseHandle(g_hBuffer); //关闭这个句柄
return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -