本文介绍了linux上写的一个简单的C++共享内存程序:segmentation fault的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <string>
#include <vector>
#include <iostream>

using namespace std;

struct LOCK {
  string name;
  string type;
  vector <string> pids;
};

int main ()

{

  int segment_id;

  LOCK* shared_memory;

  struct shmid_ds shmbuffer;

  int segment_size;

  const int shared_segment_size = 0x6400;



  /* Allocate a shared memory segment.  */

  segment_id = shmget (IPC_PRIVATE, shared_segment_size,

                     IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);

  /* Attach the shared memory segment.  */

  shared_memory = (LOCK*) shmat (segment_id, 0, 0);

  printf ("shared memory attached at address %p
", shared_memory);

  /* Determine the segment's size. */

  shmctl (segment_id, IPC_STAT, &shmbuffer);

  segment_size  =               shmbuffer.shm_segsz;

  printf ("segment size: %d
", segment_size);

  /* Write a string to the shared memory segment.  */

  //sprintf (shared_memory, "Hello, world.");
  shared_memory -> name = "task 1";
  shared_memory -> type = "read";
  (shared_memory -> pids).push_back("12345");
  (shared_memory -> pids).push_back("67890");

  /* Detach the shared memory segment.  */

  shmdt (shared_memory);



  /* Reattach the shared memory segment, at a different address.  */

  shared_memory = (LOCK*) shmat (segment_id, (void*) 0x5000000, 0);

  printf ("shared memory reattached at address %p
", shared_memory);

  /* Print out the string from shared memory.  */

  //printf ("%s
", shared_memory -> name);
  cout << "Name of the shared memory: " + shared_memory -> name << endl;

  /* Detach the shared memory segment.  */

  shmdt (shared_memory);



  /* Deallocate the shared memory segment.  */

  shmctl (segment_id, IPC_RMID, 0);



  return 0;

}

我从有关共享内存的教程中获得了代码.它一直有效,直到我定义了 struct LOCK 并尝试将 LOCK 而不是 char* 写入共享内存.

I got the code from a tutorial on shared memory. It worked until I defined struct LOCK and tried to write LOCKs instead of char* into the shared memory.

有人可以帮我找出导致分段错误的问题吗?

Could someone please help me figure out the problem here that causes the segmentation fault?

推荐答案

您正在将 vectors 和 strings 放入共享内存中.这两个类都分配自己的内存,这些内存将在生成分配的任何进程的地址空间内分配,并且在从其他进程访问时会产生段错误.您可以尝试指定分配器以使用该共享内存,但由于在 C++03 中分配器被假定为无状态,我不确定它是否可能.

You are placing vectors and strings into shared memory. Both those classes allocate memory of their own, which will be allocated within the address space of whatever process generates the allocation, and will produce a segfault when accessed from the other process. You could try specifying allocators to use that shared memory, but since in C++03 allocators are assumed to be stateless I'm not sure if it will be possible.

考虑看看 Boost.Interprocess 是如何做到的.

Consider checking out how Boost.Interprocess does it.

这篇关于linux上写的一个简单的C++共享内存程序:segmentation fault的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 05:29