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

📄 进程r.txt

📁 进程通信与进程同步机制实践 有三个进程R、M、P
💻 TXT
字号:
//进程R
#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;  
	}
//以上的代码对所有的程序都是一样的
//下面开始R的工作
	BOOL end = FALSE;
	while(!end)
	{   char data[32];
		printf("***数据输入***\n");
		printf("请输入数据:");
        fflush(stdin);
		gets(data);
		printf("接受到数据:%s\n", data);
printf("\tP(synR)\n");
		P(g_hSemSynR);
g_nR = g_pszBuffer[0];
		strncpy(g_pszBuffer + 3 + g_nR * 32, data, 31);
		g_pszBuffer[0] = g_nR = (g_nR + 1) % 10;
		printf("\t数据已经放入缓冲区\n");
printf("\tV(synM)\n");
		V(g_hSemSynM);
char endCH;
		printf("Go on? ");
		fflush(stdin);
		scanf("%c", &endCH);
		if(endCH != 'y' && endCH != 'Y' ) end = TRUE;
	}

	//R的工作到此结束

UnmapViewOfFile(g_pszBuffer);//断开和共享内存的连接
CloseHandle(g_hBuffer);//关闭这个句柄
return;
}
 

 

 


⌨️ 快捷键说明

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