Я пытаюсь отправить строки текста из программы для записи в программу для чтения через общую память.Писатель работает отлично.Однако во время выполнения программы чтения я получаю ошибку сегментации в следующей строке
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;
}