Хорошо, У меня есть рабочая программа, которая читает внешнюю виртуальную память в Linux. Вот что я хочу сделать: Программа 1 выполняется и имеет определенные адреса в памяти для связи с программой 2. Я знаю, что программа 2, которая читает и записывает значения в программу 1 и из нее, работает. Я застрял в создании программы 2, у меня есть этот код:
#include <iostream>
using namespace std;
int main()
{
int* i;
i = (int*)0x7ffABCDDCBA1;
*i = 1;
cout << *i << " " << i << endl;
}
Примечание:
это просто тестовый код, чтобы убедиться, что он работает (а это не так)
program1 будет читать 0x7ffABCDDCBA1 в pid программы 2, он компилируется нормально, но при выполнении я получаю "Ошибка сегментации"
Примечание:
#include <iostream>
using namespace std;
int main()
{
int* i;
i = (int*)0x7ffABCDDCBA1;
cout << i << endl;
}
Отлично работает
Адреса памяти в одном процессе не имеют значения в другом процессе. Вот для чего нужна виртуальная адресация.
Вы обращаетесь к некоторой случайной области памяти, которая, скорее всего, не принадлежит адресному пространству вашего процесса и поэтому вызывает неопределенное поведение.
Вы должны использовать разделяемую память между процессами: Как использовать разделяемую память в Linux.
Есть несколько других техник, но этот чаще всего используется для этой цели.
Вы правы в этом, но мне интересно, смогу ли я сделать это таким образом, этот проект просто для развлечения, поэтому, если бы был способ сделать это так, было бы неплохо
Да, это работает мог бы, но, как я уже сказал, он имеет поведение Undefined. Вот почему это иногда работает, а иногда нет.
Нет проблем, я бы порекомендовал вам статью о адресном пространстве Linux. Это забавное чтение
вы должны знать разницу между * i и i. вы можете разыменовать недопустимый адрес памяти в первом коде