SHM
共有メモリを用いた高速で扱いやすいプロセス間通信マネージャ
main.cpp
1 #include <iostream>
2 #include <getopt.h>
3 #include <string.h>
4 
5 #include "shm_base.hpp"
6 
7 enum MODE
8 {
9  LIST_MODE,
10  REMOVE_MODE,
11 };
12 
13 char *progname;
14 
15 void
16 general_usage()
17 {
18  std::cout << progname << " is a command-line tool to operate shared memory that shm used" << std::endl << std::endl;
19  std::cout << "Commands:" << std::endl;
20  std::cout << "\t" << progname << " list\tlist up shared memory" << std::endl;
21  std::cout << "\t" << progname << " remove\tremove shared memory" << std::endl;
22 }
23 
24 void
25 remove_usage()
26 {
27  std::cout << "Usage: " << progname << " remove <shm_name>" << std::endl;
28 }
29 
30 int
31 main(int argc, char *argv[])
32 {
33  int opt;
34  MODE mode;
35 
36  progname = basename(argv[0]);
37 
38  if (argc < 2)
39  {
40  general_usage();
41  return 1;
42  }
43 
44  if (!strncmp(argv[1], "list", 4))
45  {
46  mode = LIST_MODE;
47  }
48  else if (!strncmp(argv[1], "remove", 6))
49  {
50  mode = REMOVE_MODE;
51  }
52 
53  FILE *fp;
54  char buf[256];
55  std::string buf_str;
56  const char* format[] = {" ", "\t\t", "\t", "\t", "\t", " ", " ", " ", "\t", ""};
57  switch (mode)
58  {
59  case LIST_MODE:
60  fp = popen("ls -l /dev/shm/", "r");
61  std::cout << "Permission Hard-link\tUser\tGroup\tSize\tTimestamp\tShared memory name" << std::endl;
62  while (1)
63  {
64  fgets(buf, sizeof(buf), fp);
65  if(feof(fp))
66  {
67  break;
68  }
69 
70  if(ferror(fp))
71  {
72  fprintf(stderr, "input stream error\n");
73  break;
74  }
75  buf_str = buf;
76  if (buf_str.find("shm_") == std::string::npos)
77  {
78  continue;
79  }
80  buf_str = regex_replace(buf_str, std::regex("shm_"), "");
81  {
82  auto offset = std::string::size_type(0);
83  for (int i = 0; i < 10; i++)
84  {
85  auto pos = buf_str.find(" ", offset);
86  if (pos == std::string::npos) {
87  std::cout << buf_str.substr(offset);
88  break;
89  }
90  std::cout << buf_str.substr(offset, pos - offset) << format[i];
91  offset = pos + 1;
92  }
93  }
94  }
95  (void) pclose(fp);
96  break;
97  case REMOVE_MODE:
98  if (argc < 3)
99  {
100  remove_usage();
101  return 1;
102  }
103  irlab::shm::disconnectMemory(argv[2]);
104  break;
105  default:
106  general_usage();
107  }
108 
109  return 0;
110 }
shm_base.hpp
共有メモリへのアクセス方法やリングバッファなどの基本的なクラスの定義