Невозможно получить доступ к массиву строк в общей памяти - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь отправить строки текста из программы для записи в программу для чтения через общую память.Писатель работает отлично.Однако во время выполнения программы чтения я получаю ошибку сегментации в следующей строке

cout<<buffer->str[initial]<<endl;

Изменения в значении счетчика общей структуры видны и корректноувеличивается, когда я запускаю читателя одновременно с писателем, комментируя приведенную выше строку.Следовательно, согласно моему диагнозу, проблема заключается в доступе к массиву строк общей структуры.Почему это так?

Код состоит из writer.cpp и reader.cpp, которые были предоставлены ниже для справки.

Цель writer.cpp - прочитать строки из входного файла и записать их в общую память.

Writer.cpp

// for c++ related functions
#include<iostream>
#include<fstream>
#include<string>

// for c related functions
#include<cstdio>
#include<cstdlib>
#include<unistd.h>

// for system calls
#include<sys/types.h>
#include<sys/ipc.h>
// for shared memory
#include<sys/shm.h>

using namespace std;

// store the key for accessing the shared memory
key_t shm_key = ftok("practical",65);

// the structure for shared memory
struct shared{
  bool the_end = false;
  int count = 0;
  string str[6];
};

int main(){

  // create the shared memory
  int shmid = shmget(shm_key,sizeof(shared),0666|IPC_CREAT);
  if(shmid == -1){
    perror("Error in creating shared memory");
    return 1;
  }

  // attach server to the shared memory
  struct shared *buffer = (shared*)shmat(shmid,NULL,0);
  if(buffer == (void *) -1){
     perror("Unable to attach to shared memory");
     return 1;
  }

  // open the file for reading the input
  ifstream fin("input.txt");
  // check for errors in opening the file
  if(!fin){
    cerr<<"Error in opening the file"<<endl;
    exit(1);
  }

  // to store the read line
  string inptxt;
  cout<<"Reading contents from file\n"<<endl;

  while(fin){
    // read a line
    getline(fin,inptxt);

    // exit the loop if string is empty
    if(inptxt == "\0") break;

    // store the line in the buffer
    buffer->str[buffer->count++] = inptxt;
    cout<<"This was written : "<<buffer->str[buffer->count-1]<<endl;

    sleep(3);
  }
  cout<<"Closing the file"<<endl;
  fin.close();

  // marks the end of writing into shared memory
  buffer->the_end = true;

  if(shmdt(buffer) == -1){
     perror("error in deatching from shared memory");
     return 1;
  }

  if(shmctl(shmid,IPC_RMID,0) == -1){
     perror("error in destroying the shared memory");
     return 1;
  }

  cout<<"Writing Completed"<<endl;
  return 0;
}

Задача программы чтения - прочитать строки из общей памяти и затем отобразить их на консоли.

Reader.cpp

// for c++ related functions
#include<iostream>
#include<fstream>
#include<string>

// for c related functions
#include<cstdio>
#include<cstdlib>
#include<unistd.h>

// for system calls
#include<sys/types.h>
#include<sys/ipc.h>
// for shared memory
#include<sys/shm.h>

using namespace std;

// store the key for accessing the shared memory
key_t shm_key = ftok("practical",65);

// the structure for shared memory
struct shared{
  bool the_end = false;
  int count = 0;
  string str[6];
};

int main(){

  // create the shared memory
  int shmid = shmget(shm_key,sizeof(shared),0666|IPC_CREAT);
  if(shmid == -1){
    perror("Error in creating shared memory");
    return 1;
  }

  // attach server to the shared memory
  struct shared *buffer = (shared*)shmat(shmid,NULL,0);
  if(buffer == (void *) -1){
     perror("Unable to attach to shared memory");
     return 1;
  }

  cout<<"Reading contents from shared memory\n"<<endl;

  int initial = 0;
  while(!buffer->the_end){
    if(buffer->count > initial){
      cout<<"initial : "<<initial<<" buffer count : "<<buffer->count<<"\n";
      // the following line gives segmentation fault
      // cout<<buffer->str[initial]<<endl;
      initial++;
    }
  }

  if(shmdt(buffer) == -1){
     perror("error in deatching from shared memory");
     return 1;
  }

  cout<<"Reading Completed"<<endl;
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...