Могу ли я использовать один и тот же указатель для вызова данных из другого файла EXE? - PullRequest
2 голосов
/ 20 марта 2012

Я пытаюсь создать два файла .exe в c, где первый хранит некоторые данные в памяти и сохраняет указатель данных на .txt. а второй читает указатель из .txt и отображает их.

первый: fw = fopen("pointer.txt", "w"); fprintf(fw, "%p", &data); fclose(fw);

второй: fr = fopen("pointer.txt", "r"); fscanf(fr, "%p", &pointer);

но когда я запускаю второй, он отображает случайные числа.

что не так?

Ответы [ 5 ]

2 голосов
/ 20 марта 2012

Процессы работают не с реальной памятью, а с виртуальной памятью, выделенной им системой.Поэтому 0x01111 из P1 и 0x01111 из P2 не указывают на один и тот же сектор вашей оперативной памяти.Ergo, нет, вам нужно использовать IPC, я думаю.

2 голосов
/ 20 марта 2012

Нет, вы не должны этого делать.
Адрес может быть недействительным в процессе, в котором запускается второй исполняемый файл.

Каждому процессу выделяется адресное пространство, и каждый исполняемый файл выполняется в отдельном процессе. Таким образом, адресное пространство, выделенное двум процессам, может быть совершенно разным.

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

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

Если вы хотите обмениваться контентом между двумя неактивными процессами (Либо один из процессов не является живым, когда вам нужно обмениваться данными между ними), тогда хранение содержимого в файле - хорошая идея но вы должны хранить содержимое, а не адреса памяти.

1 голос
/ 20 марта 2012

Для этого вам нужно будет использовать механизмы IPC. Посмотрите на http://en.wikipedia.org/wiki/Shared_memory#In_software

1 голос
/ 20 марта 2012

То, что вы хотите сделать, возможно, но ваш подход не верен - каждый процесс имеет свое собственное виртуальное адресное пространство, и поэтому адрес, который имеет значение в одном процессе, может не быть в другом, и в любом случае он не будет ссылаться натой же памяти.

Если вы хотите разделить ресурсы между такими процессами, вам нужно попросить Windows разрешить вам.Смотрите эту страницу для некоторых деталей: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366878%28v=vs.85%29.aspx.

1 голос
/ 20 марта 2012

Виртуальная память для каждого процесса. См. Википедия об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...