Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2

Почему в родителе а потомке переменная имеет один и тот же адрес виртуальной оперативной памяти?

26.01.2019, 14:08. Показов 1612. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
//#include <sys/wait.h>
 
int main()
{
pid_t child;
int X = 1;
 
if ((child = fork()) < 0) { 
fprintf(stderr, " error fork %s\n", strerror(errno));
exit(1);
 
} else if (child == 0) { 
X = X + 23; 
printf("X-CHILD:  %d  %p\n", X, &X);
//exit(0);  
} else { 
X = X + 1;  
printf("X-PARENT: %d  %p\n", X, &X);
sleep(1);   
//exit(0);  
}
 
printf("X: %d   %p\n", X, &X); 
}
Результат - что-то вроде:
Bash
1
2
3
4
X-PARENT: 2  0x7ffea4124d40
X-CHILD:  24  0x7ffea4124d40
X: 24   0x7ffea4124d40
X: 2   0x7ffea4124d40
Добавлено через 2 минуты
Вроде как, для потомка должна бы создаваться КОПИЯ переменной Х (что, кстати, видно по разным ее значениям, выводимым потомком и родителем). А раз копия, стало быть, эта копия должна получить ДРУГОЙ виртуальный адрес?
Или все дело в РАЗНЫХ виртуальных адресных пространствах потомка и родителя? Т.е. происходит формальное совпадение, не более того?

Добавлено через 2 минуты
Если я прав, тогда можно ли из родителя получить доступ к адресному пространству потомка? Или будет ошибка сегментации?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.01.2019, 14:08
Ответы с готовыми решениями:

Почему выводится один и тот же адрес памяти при одновременных запусках одной программы
Здравствуйте, уважаемые программисты У меня к вам такой вопрос: при запуске программы, которая содержит указатель на некую переменную...

Использование оперативной памяти вместо виртуальной
Здравструйте. У меня 16 Гб ОЗУ, которые ни разу польностью заполнены не были. В то же время есть некоторые программы, которые без...

Программа реализующая мониторинг оперативной и виртуальной памяти
Написать программу которая реализует мониторинг оперативной и виртуальной памяти то есть сколько всего памяти той и той сколько...

15
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
26.01.2019, 14:15
Цитата Сообщение от Htext Посмотреть сообщение
Вроде как, для потомка должна бы создаваться КОПИЯ переменной Х (что, кстати, видно по разным ее значениям, выводимым потомком и родителем). А раз копия, стало быть, эта копия должна получить ДРУГОЙ виртуальный адрес?
То есть само слово "виртуальный" в словосочетании "виртуальный адрес" ни на что не намекает?

Добавлено через 1 минуту
Цитата Сообщение от Htext Посмотреть сообщение
Если я прав, тогда можно ли из родителя получить доступ к адресному пространству потомка?
Обратившись по виртуальному адресу в своем приложении, ты получишь данные из физической памяти, которая связана с этим адресом для твоего процесса. Думаю, на второй вопрос можно не отвечать.
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
26.01.2019, 14:24  [ТС]
Цитата Сообщение от krolligator Посмотреть сообщение
Думаю, на второй вопрос можно не отвечать.
Я не собираюсь получать доступ к чужим данным. Мне просто интересно, возможно ли это именно для родителя по отношению к ЕГО потомку. Если не организовывать переполнение, конечно. Т.е. в штатном режиме.

Добавлено через 3 минуты
Цитата Сообщение от krolligator Посмотреть сообщение
"виртуальный адрес" ни на что не намекает?
На полное совпадение виртуальных адресов переменной Х точно не намекает.
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
26.01.2019, 14:31
Цитата Сообщение от Htext Посмотреть сообщение
Я не собираюсь получать доступ к чужим данным.
Я про это и не говорил. Я посчитал, что ответа на первый вопрос достаточно для того, чтобы понять ответ на второй. Тогда еще немного: у процесса есть своя таблица связи виртуальных адресов с физическими (шареные либы не рассматриваем). Запрос по одному виртуальному адресу в разных процессах - будет инициировать обращение к разной области физической памяти.
Все остальное ты прочитаешь в любой статье или книге о том, как работает виртуальная память. Рекомендую kerrisk'а.
Память можно читать читать используя /proc/<pid>/mem или, например, ptrace.

Добавлено через 4 минуты
Цитата Сообщение от Htext Посмотреть сообщение
На полное совпадение виртуальных адресов переменной Х точно не намекает.
Это намекает на то, что сравнивать виртуальные адреса - глупо. Тем более, у клонированных процессов. Для них иметь одинаковые адреса - более чем нормально.
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
26.01.2019, 14:34  [ТС]

Не по теме:

Цитата Сообщение от krolligator Посмотреть сообщение
как работает виртуальная память
Я в курсе.


К сожалению, нет ответа на мой вопрос.

Добавлено через 32 секунды
Цитата Сообщение от krolligator Посмотреть сообщение
Для них иметь одинаковые адреса - более чем нормально.
А вот об этом, если можно, подробнее.
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
26.01.2019, 14:39
Цитата Сообщение от Htext Посмотреть сообщение
Я в курсе.
Судя по теме, ни хрена.
Цитата Сообщение от Htext Посмотреть сообщение
К сожалению, нет ответа на мой вопрос.
А я его вижу.
Цитата Сообщение от Htext Посмотреть сообщение
А вот об этом, если можно, подробнее.
О чем именно? Клон процесса получает тот же range виртуальных адресов замапленный на другие физические (а с самого начала даже физически память та же самая же из-за CoW). Что из этого вызывает вопросы?
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
26.01.2019, 14:52  [ТС]
krolligator, судя по вашим ответам, вы даже не можете толком прочесть вопрос, не говоря уже об ответе на него. Вместо этого пишете пространно и, отчасти, не по теме вопроса. Вот что я спросил (лично для вас, для наглядности, перенумерую вопросы), еще раз:
Цитата Сообщение от Htext Посмотреть сообщение
1. А раз копия, стало быть, эта копия должна получить ДРУГОЙ виртуальный адрес?
2. Или все дело в РАЗНЫХ виртуальных адресных пространствах потомка и родителя?
3. Т.е. происходит формальное совпадение, не более того?
4. Если я прав, тогда можно ли из родителя получить доступ к адресному пространству потомка?
5. Или будет ошибка сегментации?
Это
Цитата Сообщение от krolligator Посмотреть сообщение
Клон процесса получает тот же range виртуальных адресов замапленный на другие физические (а с самого начала даже физически память та же самая же из-за CoW).
дает утвердительный ответ на вопрос №2, как и написано в том вопросе. Только у меня сказано короче и яснее, без словесных искажений.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
26.01.2019, 14:54
Htext, Представьте, что мы пытаемся применить memcpy() к любому объекту содержащему указатели. Очевидно копия окажется не работоспособной. Если к конкретному объекту мы можем применить какую-то технику сериализации, то у fork() такой возможности нет. Поэтому виртю адреса полностью совпадают
1
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
26.01.2019, 15:05  [ТС]
Цитата Сообщение от Htext Посмотреть сообщение
дает утвердительный ответ
Точнее даже можно сказать так: формально (лишь по номерам адресов переменных, функций...) адресные пространства родителя и потомка совпадают, но они - все-таки независимые, разные.
Но, это для процессов. Для потоков, насколько я понимаю, виртуальное пространство будет реально общее.
Цитата Сообщение от prik Посмотреть сообщение
применить memcpy() к любому объекту содержащему указатели
Не поленился, нашел у себя примерно такое:
C
1
memcpy((void *)x, (void *)&h, sizeof(h));
Добавлено через 1 минуту
Хотя, речь тут не об
Цитата Сообщение от prik Посмотреть сообщение
объекту содержащему указатели
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
26.01.2019, 15:18
Лучший ответ Сообщение было отмечено Htext как решение

Решение

Цитата Сообщение от Htext Посмотреть сообщение
Не поленился, нашел у себя примерно такое:
Как вы ниже заметили это не оно, но суть моего пассажа в том, что мы не можем гарантировать, что копия произвольных данных полученная через memcpy() сохранит работоспособность.

Добавлено через 5 минут
Если вы хотите увидеть разные адреса в родителе и ребенке - нужен проход через exec(). Такую технику применяют, как раз для рэндомизации адресного пространства в приложениях с повышенной оглядкой на безопасность.
1
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
26.01.2019, 15:29  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
суть моего пассажа в том
Ну, да. Хотя, честно говоря, подробно в этом я не разбирался.
Почему вопрос-то у меня возник: чисто ради интереса, дай, думаю, посмотрю в одной программе адреса одной переменной. Смотрю - совпадают... вот это и ввело меня в ступор поначалу. Сейчас, да, разобрался, спасибо. Омонимы.

Добавлено через 1 минуту
Цитата Сообщение от prik Посмотреть сообщение
exec()
Что-то я даже не подумал о такой возможности. Хотя сам же его иногда использую)
0
Фрилансер
 Аватар для Black Fregat
3709 / 2082 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
26.01.2019, 16:06
Цитата Сообщение от Htext Посмотреть сообщение
Точнее даже можно сказать так: формально (лишь по номерам адресов переменных, функций...) адресные пространства родителя и потомка совпадают, но они - все-таки независимые, разные.
Если на улице Стрелковой есть дом 99 и на улице Штыковой есть дом 99, можно ли сказать, что формально (лишь по номерам домов) эти улицы совпадают?

При форке, грубо говоря, делается точная копия всего виртуального пространства. Со всей внутренней структурой. Поэтому все виртуальные адреса сохранятся. А физические будут разные, их разведёт механизм страничной адресации
1
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
26.01.2019, 16:54  [ТС]
Цитата Сообщение от Black Fregat Посмотреть сообщение
Если на улице Стрелковой есть дом 99 и на улице Штыковой есть дом 99, можно ли сказать, что формально (лишь по номерам домов) эти улицы совпадают?
При форке, грубо говоря, делается точная копия всего виртуального пространства. Со всей внутренней структурой. Поэтому все виртуальные адреса сохранятся. А физические будут разные, их разведёт механизм страничной адресации
Да, вот именно так я теперь и понял. Надеюсь, отчетливо...

А вот все-таки, возможен ли доступ к памяти другого процесса (потомка) без использования ехес?
Вот функции есть http://man7.org/linux/man-page... adv.2.html
http://man7.org/linux/man-pages/man2/ptrace.2.html
Есть даже похожая тема Доступ к памяти другого процесса, но она - для Windows.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
26.01.2019, 17:10
Цитата Сообщение от Htext Посмотреть сообщение
А вот все-таки, возможен ли доступ к памяти другого процесса (потомка) без использования ехес?
Не понятно, чем тут поможет exec(). Да возможен, вы же сами 2 метода для этого нашли.
Другое дело, что непонятно, зачем это может понадобиться если программа не занимается чем-то похожим на отладку чужих процессов.
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
26.01.2019, 17:47  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
зачем это может понадобиться
Да чисто для себя, для развития и понимания возможностей Linux.
0
28.01.2019, 14:32

Не по теме:

Цитата Сообщение от Htext Посмотреть сообщение
Вместо этого пишете пространно и, отчасти, не по теме вопроса
Тебе бесполезно объяснять, ты не вдупляешь ровным счетом ничего. Даже значения слова "клонировать". Только после того, как 10 раз написали одно и то же про клонирование, что-то дошло. И то не факт. О чем с тобой вообще разговаривать.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.01.2019, 14:32
Помогаю со студенческими работами здесь

Адрес Bios в оперативной памяти
Хочется уточнить, по какому же адресу считывается в оперативную память bios. В различных источниках всё сводится к пространству...

При удаленном подключении к VPN получать один и тот же IP адрес
Добрый день всем! Вопрос в следующем на сервере Win 2008 настроен VPN и DHCP-сервер, который автоматически раздает IP адреса, мне нужно...

Имеет ли C# доступ к оперативной памяти другого процесса?
Доброго времени суток. Возможно ли сделать изменение значения экземпляра поля в одном процессе из другого процесса? По подробнее о том...

Какой объем оперативной памяти имеет компьютер?
Компьютер имеет байтовую организацию операционной памяти.Какой объем оперативной памяти имеет компьютер, если адрес предпоследнего байта...

Убить процесс, если тот потребляет количество оперативной памяти больше установленного значения
Здравствуйте. Собственно, весь вопрос в заголовке. Как это реализовать? Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru