c - 使用共享内存将数据结构传递给另一个进程并保存到文件

标签 c shared-memory

我正在使用共享内存将数据(名称、ph 值和地址)发送到另一个进程。我必须在第二个进程中打印数据并将它们存储到文件中。我已经尝试过这段代码,但我没有在第二个进程中接收数据。有人可以帮我弄这个吗。 谢谢。

address.c

        typedef struct 
{
  char lname[25];
  char fname[20];
  char address[20];
  char phonenumber[20];
}addressbook;

addressbook a;

char *shared_memory;
int main()
{
  int select;
  int segment_id;
  char* shared_memory;
  int segment_size;
  key_t shm_key;
  const int shared_segment_size = 0x6500;
  shm_key = ftok("/home/madan/programs/shm_tok",'C');
  if(shm_key < 0) {
    printf("failed to create the key %s\n",strerror(errno));
  }
  /* Allocate a shared memory segment. */
   segment_id = shmget (shm_key, shared_segment_size,
            IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
    if(segment_id < 0) {
      printf("error geting the segment id %s\n",strerror(errno));
    }
    printf("segment ID:%d\n", segment_id);
   /* Attach the shared memory segment. */
   shared_memory = (char*) shmat (segment_id, 0, 0);
   printf ("shared memory attached at address %p\n", shared_memory);


   printf("enter lastname:\n");
   gets(a.lname);
   printf("enter firstname:\n");
   gets(a.fname);
   printf("enter address:\n");
   gets(a.address);
   printf("enter phone number:\n");
   gets(a.phonenumber);


   memcpy(shared_memory, &a, sizeof(a));

   printf("data:%s\n", shared_memory);

   system("./address-insert");
      /* Detach the shared memory segment. */
  shmdt (shared_memory);
   /

    * Deallocate the shared memory segment.*/
           shmctl (segment_id, IPC_RMID, 0);
}
<小时/>
address-insert.c

typedef struct 
{
  char lname[20];
  char fname[20];
  char address[20];
  char phonenumber[20];
}addressbook;
addressbook a;
int main ()
{
  int segment_id;
  char* shared_memory;
  FILE *fp;
  char *name;
  int segment_size;
   key_t shm_key;
  shm_key = ftok("/home/madan/programs/shm_tok",'D');
  const int shared_segment_size = 0x6500;
  /* Allocate a shared memory segment. */
  segment_id = shmget (shm_key, shared_segment_size,
              S_IRUSR | S_IWUSR);
  if(segment_id < 0) {
    printf("error:[%s]",strerror(errno));
  }
  printf("segment id %d\n",segment_id);
  /* Attach the shared memory segment. */
  shared_memory = (char*) shmat (segment_id, 0, 0);
  if(shared_memory == NULL) {
    printf("failed to attach the shared memory %s",strerror(errno));
  }
  printf ("shared memory2 attached at address %p\n", shared_memory);

  printf ("name=%s\n", shared_memory);

  memcpy(&a, shared_memory, sizeof(a));
  printf("name: %s\n", a.fname);
  printf("address:%s\n", a.address);
  printf("phone number=%s\n", a.phonenumber);

  fp = fopen("filename","a+");
  fwrite(a, 1, strlen(a),fp);
  fclose(fp);


  /* Detach the shared memory segment. */
  shmdt (shared_memory);
  return 0;
}

最佳答案

为什么需要两个进程?如果你想这样做,你还需要一个信号器 - 以便其他进程可以确保所有数据都在共享内存中。也许管道(UNIX 或其他)会更简单。

关于c - 使用共享内存将数据结构传递给另一个进程并保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7263999/

相关文章:

c - 在哪里放置用于从共享内存段读取和写入的信号量?

c - 内存并在共享内存中的指针中传递值

c - 如何制作具有特定数组大小的共享内存?

c - 是否可以在运行时找到结构变量和全局变量的 sizeof 和地址?

c - 为什么 scanf 扫描的数字与我输入的数字不同?

c - 谁调用了 atexit()?

fortran - Fortran 中具有不同窗口大小的 MPI 共享内存

memory - CUDA 共享内存和全局内存有什么区别?

c void 指针数组打印

c++ - 循环中的预递增/递减与使用 gcc 和 Visual C 的递增/递减