Solved

How can I tell when a second process has accessed shared memory?

Posted on 2009-04-09
1
338 Views
Last Modified: 2013-12-03
Hello all,

I have a simple c++ program running in windows that creates a file mapping object, etc. to share some memory with a second process. How can I tell when some process has accessed the shared memory? Please see my code.
#define BUF_SIZE	256	
 

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <windows.h>

#include <conio.h>

#include <tchar.h>

#include <memory.h>
 

char szName[] = "Global\\MyFileMappingObject";

char message[] = "This will be shared";
 

int main()

{

	HANDLE hMapFile = CreateFileMapping(

		INVALID_HANDLE_VALUE,

		NULL,

		PAGE_READWRITE,

		0,

		BUF_SIZE,

		szName);
 

	LPCTSTR pBuf = (LPTSTR)MapViewOfFile(

		hMapFile,

		FILE_MAP_ALL_ACCESS,

		0,

		0,

		BUF_SIZE);
 

	CopyMemory((PVOID)pBuf, message, (strlen(message) * sizeof(TCHAR)));
 

	getch();
 

	UnmapViewOfFile(pBuf);

	CloseHandle(hMapFile);

	return 0;

}

Open in new window

0
Comment
Question by:ehensens
1 Comment
 
LVL 86

Accepted Solution

by:
jkr earned 500 total points
ID: 24107788
You only can tell that for sure when both processes signal these events to each other. See also http://www.codeproject.com/KB/threads/sharedmemipc.aspx ("Interprocess Communication using Shared Memory"). E.g.
#include <sys/types.h>

#include <windows.h>

#include <conio.h>

#include <tchar.h>

#include <memory.h>

 

char szName[] = "Global\\MyFileMappingObject";

char message[] = "This will be shared";

 
 

HANDLE ConnectEvent ( LPCTSTR pszName)

{
 

   HANDLE hEvent   =   CreateEvent (   NULL,

                                       FALSE,

                                       FALSE,

                                       pszName

                                   );
 

   if  (   INVALID_HANDLE_VALUE    ==  hEvent)

       {

           if  (   ERROR_ALREADY_EXISTS    ==  GetLastError    ())

               {

                   hEvent  =   OpenEvent   (   SYNCHRONIZE,

                                               FALSE,

                                               pszName

                                           );
 

                   if  (   INVALID_HANDLE_VALUE    ==  hEvent)

                       {
 

                           return NULL;

                       }

               }

       }
 

   return hEvent;

}
 

int main()

{

        HANDLE hMapFile = CreateFileMapping(

                INVALID_HANDLE_VALUE,

                NULL,

                PAGE_READWRITE,

                0,

                BUF_SIZE,

                szName);

 

        LPCTSTR pBuf = (LPTSTR)MapViewOfFile(

                hMapFile,

                FILE_MAP_ALL_ACCESS,

                0,

                0,

                BUF_SIZE);
 

        HANDLE hEvent = ConnectEvent("Global\\MyFileMappingEvent");

 

        CopyMemory((PVOID)pBuf, message, (strlen(message) * sizeof(TCHAR)));
 

        // Signal to other process that data was set

        SetEvent(hEvent);

 

        getch();

 

        UnmapViewOfFile(pBuf);

        CloseHandle(hMapFile);

        return 0;

}
 

// other process
 

// ...
 

        HANDLE hEvent = ConnectEvent("Global\\MyFileMappingEvent");

 

        // Wait for other process to signal that data has been copied

        WaitForSingleObject(hEvent,INFINITE);
 

        // Process data
 

        // ...

Open in new window

0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
IdTCPClient1->Disconnect(); not working 3 61
I could not build boost code, 10 79
passing data from one form to another form in c++ 27 75
C++ mouse_event mouse look 7 70
Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
Whether you've completed a degree in computer sciences or you're a self-taught programmer, writing your first lines of code in the real world is always a challenge. Here are some of the most common pitfalls for new programmers.
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

895 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now