The shared memory library, libshm provides operating system independent access to shared memory objects.
This library is available for general use, however it's primary use is to improve portability of the RingBuffer software within the NSCL DAQ system.
To use the software, you must
Incorporate the library header into your source code
Link your program to the library run-time
Reference information is available in the reference section
The API is implemented as a C++ class named
CDaqSHM
with the following static methods:
create
creates a new region.
attach
attaches to an existing region.
detach
Detaches from a shared memory region.
remove
destroys and
existing shared memory
size
returns the size
of a shared memory region in bytes.
lastError
retrieves the last error status
errorMessage
looks up an error message
Note that the class is not threadsafe in that the error status information is static and therefore shared between all threads without any interlocking.
The sample program below creates a new shared memory region (if the region does not yet exist), obtains a pointer to it, then some time later detaches from it. The create and attach calls also illustrate error management.
Example 32-1. Shared memory library example
#include <daqshm.h> #include <string> ... // Create the shared memory region.. report any error except // that the region already exists: bool status = CDAQShm::create("mymemory", 0x10000, CDAQShm::GroupRead | CDAQShm::GroupWrite | CDAQShm::OtherRead | CDAQShm::OtherWrite); if (status && (CDAQShm::lastError() != CDAQShm::Exists)) { std::string exception = "Failed to create new shared memory mymemory: "; exception += CDAQShm::errorMessage(CDAQShm::lastError()); throw exception; } // Attach to the region: void* pMemory = CDAQShm::attach("mymemory"); if (!pMemory) { std::string exception = "Failed to attach to shared memory mymemory: "; exception += CDAQShm::errorMesszage(CDAQShm::lastError()); throw exception; } // At this time pMemory can be used to read/write the shared memory region. .... if (CDAQShm::detach(pMemory, "mymemory", 0x10000)) { std::string exception = "Failed to detach mymemory: "; exception += CDAQShm::errorMessage(CDAQShm::lastError()); }
std::string
is thrown.
The contents of the string provide context for the exception
as well as the reason the creation failed.
attach
failed.
Once the attach
has been done,
the shared memory can be accessed through the pointer.
detach
, no gaurantees
are made about the pointer returned from the
attach
call and it therefore
should not be dereferences
true is returned on error and once more the example code throws a descriptive string exception.