#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <cstring>
#include <cstdlib>
#include <string>
int main( int argc, char * argv[ ] )
{
using namespace boost:: interprocess ;
if ( argc == 1 ) { //Parent process
//Remove shared memory on construction and destruction
struct shm_remove
{
shm_remove( ) { shared_memory_object:: remove ( "MySharedMemory" ) ; }
~shm_remove( ) { shared_memory_object:: remove ( "MySharedMemory" ) ; }
} remover;
//Create a shared memory object.
shared_memory_object shm ( create_only, "MySharedMemory" , read_write) ;
//Set size
shm.truncate ( 1000 ) ;
//Map the whole shared memory in this process
mapped_region region( shm, read_write) ;
//Write all the memory to 1
std:: memset ( region.get_address ( ) , 1 , region.get_size ( ) ) ;
//Launch child process
std:: string s( argv[ 0 ] ) ; s + = " child " ;
if ( 0 ! = std:: system ( s.c_str ( ) ) )
return 1 ;
}
else {
//Open already created shared memory object.
shared_memory_object shm ( open_only, "MySharedMemory" , read_only) ;
//Map the whole shared memory in this process
mapped_region region( shm, read_only) ;
//Check that memory was initialized to 1
char * mem = static_cast < char * > ( region.get_address ( ) ) ;
for ( std:: size_t i = 0 ; i < region.get_size ( ) ; ++ i)
if ( * mem++ ! = 1 )
return 1 ; //Error checking memory
}
return 0 ;
}
I2luY2x1ZGUgPGJvb3N0L2ludGVycHJvY2Vzcy9zaGFyZWRfbWVtb3J5X29iamVjdC5ocHA+CiNpbmNsdWRlIDxib29zdC9pbnRlcnByb2Nlc3MvbWFwcGVkX3JlZ2lvbi5ocHA+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPHN0cmluZz4KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjppbnRlcnByb2Nlc3M7CgogICBpZihhcmdjID09IDEpeyAgLy9QYXJlbnQgcHJvY2VzcwogICAgICAvL1JlbW92ZSBzaGFyZWQgbWVtb3J5IG9uIGNvbnN0cnVjdGlvbiBhbmQgZGVzdHJ1Y3Rpb24KICAgICAgc3RydWN0IHNobV9yZW1vdmUKICAgICAgewogICAgICAgICBzaG1fcmVtb3ZlKCkgeyBzaGFyZWRfbWVtb3J5X29iamVjdDo6cmVtb3ZlKCJNeVNoYXJlZE1lbW9yeSIpOyB9CiAgICAgICAgIH5zaG1fcmVtb3ZlKCl7IHNoYXJlZF9tZW1vcnlfb2JqZWN0OjpyZW1vdmUoIk15U2hhcmVkTWVtb3J5Iik7IH0KICAgICAgfSByZW1vdmVyOwoKICAgICAgLy9DcmVhdGUgYSBzaGFyZWQgbWVtb3J5IG9iamVjdC4KICAgICAgc2hhcmVkX21lbW9yeV9vYmplY3Qgc2htIChjcmVhdGVfb25seSwgIk15U2hhcmVkTWVtb3J5IiwgcmVhZF93cml0ZSk7CgogICAgICAvL1NldCBzaXplCiAgICAgIHNobS50cnVuY2F0ZSgxMDAwKTsKCiAgICAgIC8vTWFwIHRoZSB3aG9sZSBzaGFyZWQgbWVtb3J5IGluIHRoaXMgcHJvY2VzcwogICAgICBtYXBwZWRfcmVnaW9uIHJlZ2lvbihzaG0sIHJlYWRfd3JpdGUpOwoKICAgICAgLy9Xcml0ZSBhbGwgdGhlIG1lbW9yeSB0byAxCiAgICAgIHN0ZDo6bWVtc2V0KHJlZ2lvbi5nZXRfYWRkcmVzcygpLCAxLCByZWdpb24uZ2V0X3NpemUoKSk7CgogICAgICAvL0xhdW5jaCBjaGlsZCBwcm9jZXNzCiAgICAgIHN0ZDo6c3RyaW5nIHMoYXJndlswXSk7IHMgKz0gIiBjaGlsZCAiOwogICAgICBpZigwICE9IHN0ZDo6c3lzdGVtKHMuY19zdHIoKSkpCiAgICAgICAgIHJldHVybiAxOwogICB9CiAgIGVsc2V7CiAgICAgIC8vT3BlbiBhbHJlYWR5IGNyZWF0ZWQgc2hhcmVkIG1lbW9yeSBvYmplY3QuCiAgICAgIHNoYXJlZF9tZW1vcnlfb2JqZWN0IHNobSAob3Blbl9vbmx5LCAiTXlTaGFyZWRNZW1vcnkiLCByZWFkX29ubHkpOwoKICAgICAgLy9NYXAgdGhlIHdob2xlIHNoYXJlZCBtZW1vcnkgaW4gdGhpcyBwcm9jZXNzCiAgICAgIG1hcHBlZF9yZWdpb24gcmVnaW9uKHNobSwgcmVhZF9vbmx5KTsKCiAgICAgIC8vQ2hlY2sgdGhhdCBtZW1vcnkgd2FzIGluaXRpYWxpemVkIHRvIDEKICAgICAgY2hhciAqbWVtID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHJlZ2lvbi5nZXRfYWRkcmVzcygpKTsKICAgICAgZm9yKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgcmVnaW9uLmdldF9zaXplKCk7ICsraSkKICAgICAgICAgaWYoKm1lbSsrICE9IDEpCiAgICAgICAgICAgIHJldHVybiAxOyAgIC8vRXJyb3IgY2hlY2tpbmcgbWVtb3J5CiAgIH0KICAgcmV0dXJuIDA7Cn0=