Я пишу два процесса отдельно, которые должны взаимодействовать через общую память, и я просто не могу определить, где я ошибаюсь. Первый процесс определенно создал общую память, и если он перепрограммирован, он также может считываться из разделяемой памяти.
Однако вторая программа вывода, похоже, вообще не читает. Я использую shmget в обеих программах, чтобы создать память, а затем присоединиться к ней. Я вставляю char array nameArray с помощью программы ввода, затем Output должен читать его из разделяемой памяти и cout имя.
Любая помощь приветствуется, код ниже :)
Входные данные :
#include <iostream>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#define SHM_KEY 982
using namespace std;
main()
{
int shmid;
char nameArray[] = "Bill Gates";
unsigned length = sizeof(nameArray)/sizeof(nameArray[0]);
shmid=shmget(SHM_KEY,256,0777|IPC_CREAT);
if(shmid!=(-1)) /*Error checking measure to ensure shared memory creation was successful*/
{
char * ptr=(char *)shmat(shmid,0,0); /*Assigns the char pointer to the start of shared memory*/
for(int i=0; i<length;i++) /*For every letter in the nameArray*/
{
ptr=(char *)shmat(shmid,0,i);
*ptr=nameArray[i]; /*Sends the local char array to shared memory*/
}
}
else /*Displays Error message given shared memory creation failue*/
{
cout << "Sorry, shared memory creation failed"
}
}
Вывод:
#include <iostream>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#define SHM_KEY 982
using namespace std;
main()
{
int shmid;
char nameArray[20];
shmid=shmget(SHM_KEY,256,0777|IPC_CREAT);
if(shmid!=(-1)) /*Error checking measure to ensure shared memory creation was successful*/
{
char * ptr=(char *)shmat(shmid,0,0);
for(int i=0; i<11;i++)
{
cout << *((char *)shmat(shmid,0,i));
}
}
else{}
}
Код
for(int i=0; i<length;i++) /*For every letter in the nameArray*/
{
ptr=(char *)shmat(shmid,0,i);
*ptr=nameArray[i]; /*Sends the local char array to shared memory*/
}
не делает то, что вы думаете, что это делает. Каждый вызов shmat
привязывает весь сегмент разделяемой памяти к другому адресу с разными флагами (от 0
до length
, большинство из которых бессмысленно).
Удалите вызовы shmat
из цикла. Что вам действительно нужно
for(int i=0; i<length;i++) /*For every letter in the nameArray*/
{
ptr[i]=nameArray[i]; /*Sends the local char array to shared memory*/
}
и аналогичное изменение в другой программе.
shmid
?cout << *((char *)shmat(shmid,0,i));
очень неправильно! Почему вы повторно подключаете сегмент памяти несколько раз? Делаяchar * ptr=(char *)shmat(shmid,0,0);
Вы уже приложили это. Используйтеptr
!