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

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

26.01.2019, 14:08. Показов 1669. Ответов 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 / 2083 / 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
Ответ Создать тему
Новые блоги и статьи
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru