doc_bufferstream.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the Boost
  4. // Software License, Version 1.0. (See accompanying file
  5. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // See http://www.boost.org/libs/interprocess for documentation.
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10. #include <boost/interprocess/detail/config_begin.hpp>
  11. #include <boost/interprocess/detail/workaround.hpp>
  12. //[doc_bufferstream
  13. #include <boost/interprocess/managed_shared_memory.hpp>
  14. #include <boost/interprocess/streams/bufferstream.hpp>
  15. #include <vector>
  16. #include <iterator>
  17. #include <cstddef>
  18. //<-
  19. #include "../test/get_process_id_name.hpp"
  20. //->
  21. using namespace boost::interprocess;
  22. int main ()
  23. {
  24. //Remove shared memory on construction and destruction
  25. struct shm_remove
  26. {
  27. //<-
  28. #if 1
  29. shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
  30. ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
  31. #else
  32. //->
  33. shm_remove() { shared_memory_object::remove("MySharedMemory"); }
  34. ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
  35. //<-
  36. #endif
  37. //->
  38. } remover;
  39. //<-
  40. (void)remover;
  41. //->
  42. //Create shared memory
  43. //<-
  44. #if 1
  45. managed_shared_memory segment(create_only,test::get_process_id_name(), 65536);
  46. #else
  47. //->
  48. managed_shared_memory segment(create_only,
  49. "MySharedMemory", //segment name
  50. 65536);
  51. //<-
  52. #endif
  53. //->
  54. //Fill data
  55. std::vector<int> data;
  56. data.reserve(100);
  57. for(int i = 0; i < 100; ++i){
  58. data.push_back(i);
  59. }
  60. const std::size_t BufferSize = 100*5;
  61. //Allocate a buffer in shared memory to write data
  62. char *my_cstring =
  63. segment.construct<char>("MyCString")[BufferSize](0);
  64. bufferstream mybufstream(my_cstring, BufferSize);
  65. //Now write data to the buffer
  66. for(int i = 0; i < 100; ++i){
  67. mybufstream << data[i] << std::endl;
  68. }
  69. //Check there was no overflow attempt
  70. assert(mybufstream.good());
  71. //Extract all values from the shared memory string
  72. //directly to a vector.
  73. std::vector<int> data2;
  74. std::istream_iterator<int> it(mybufstream), itend;
  75. std::copy(it, itend, std::back_inserter(data2));
  76. //This extraction should have ended will fail error since
  77. //the numbers formatted in the buffer end before the end
  78. //of the buffer. (Otherwise it would trigger eofbit)
  79. assert(mybufstream.fail());
  80. //Compare data
  81. assert(std::equal(data.begin(), data.end(), data2.begin()));
  82. //Clear errors and rewind
  83. mybufstream.clear();
  84. mybufstream.seekp(0, std::ios::beg);
  85. //Now write again the data trying to do a buffer overflow
  86. for(int i = 0, m = data.size()*5; i < m; ++i){
  87. mybufstream << data[i%5] << std::endl;
  88. }
  89. //Now make sure badbit is active
  90. //which means overflow attempt.
  91. assert(!mybufstream.good());
  92. assert(mybufstream.bad());
  93. segment.destroy_ptr(my_cstring);
  94. return 0;
  95. }
  96. //]
  97. #include <boost/interprocess/detail/config_end.hpp>