C ++: создать указатель в программе и получить доступ к этому месту в другой программе - PullRequest
1 голос
/ 20 февраля 2020

Итак, возможно ли создать указатель в C ++, как это, и распечатать его:

#include <iostream>
int main() {
    int* ptr = new int;
    (*ptr) = 3;
    std::cout << ptr << '\n';
}

И затем запустить его, скопировать значение ptr и в другую программу, пока это работает, сделать это:

#include <iostream>
#include <cstring>
int main() {
    long long pointer;
    std::cin >> pointer;
    int* ptr = nullptr;
    std::memcpy(&ptr, &pointer, sizeof(pointer));
    std::cout << *ptr << '\n';
}

И распечатать 3? Возможно ли это, а если нет, то почему?

Ответы [ 2 ]

5 голосов
/ 20 февраля 2020

Это невозможно в стандарте C ++. Стандарт C ++ не имеет понятия программы s . В отношении языка существует только одна программа - та, которая переводится в данный момент.

За пределами стандарта C ++ существуют многозадачные операционные системы, в которых можно запускать несколько программ. процессы одновременно (вы, вероятно, используете один прямо сейчас). Такие операционные системы используют виртуальную память, и один процесс не может напрямую обращаться к виртуальной памяти другого процесса.

Это технически возможно, хотя, например, используется системный вызов process_vm_readv (Linux Speci c), если вы иметь достаточные разрешения. Прежде чем использовать такой трюк, вы должны каким-то образом сообщить идентификатор процесса и виртуальный адрес, который вы хотите прочитать, которые не известны до запуска первой программы.

Хотя это может быть возможно, это, вероятно, не то, что вы нужно сделать, если вы не реализуете отладчик или похожий инструмент, возможно. Если вы хотите этого просто для того, чтобы процессы могли взаимодействовать, есть и другие способы. Нет C ++ - стандартные способы, потому что C ++ не знает процессов, но, например, стандарт POSIX определяет много способов взаимодействия процессов: общая память, файлы, сетевые сокеты и т. Д. c.

0 голосов
/ 20 февраля 2020

Это невозможно в стандарте c ++. Это связано с тем, что память программы является виртуальной, и вы не можете получить доступ к памяти других программ, поскольку они находятся в отдельной виртуальной памяти. Труба будет работать для того, что вы хотите.

...