C ++: можно ли поделиться указателем через разветвленные процессы?

StackOverflow https://stackoverflow.com/questions/650770

  •  19-08-2019
  •  | 
  •  

Вопрос

У меня есть переменная count, которая должна подсчитываться несколькими процессами, которые я разветвлял и использовал / считывал материнским процессом.

Я попытался создать указатель в моей функции main () материнского процесса и подсчитать этот указатель в разветвленных дочерних элементах. Это не работает! Кажется, что у каждого ребенка есть своя собственная копия, хотя адрес во всех процессах одинаков.

Каков наилучший способ сделать это?

Это было полезно?

Решение

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

Кстати, почему вы делаете это вики-сообществом - возможно, вы ограничиваете ответы.

Другие советы

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

Просмотрите другую форму IPC для использования.

По моему опыту, если вы хотите обмениваться информацией, по крайней мере, с двумя процессами, вы почти никогда не захотите делиться указателем void * в памяти. Возможно, вы захотите взглянуть на

Boost Interprocess

, который может дать вам представление о том, как обмениваться структурированными данными (читайте " классы " и " structs ") между процессами.

Нет, используйте IPC или темы. Совместно используются только файловые дескрипторы (но не указатель поиска).

Возможно, вы захотите проверить общую память.

указатели всегда лежат в одном и том же процессе. Это частный процесс, относительно базового адреса процесса. В различных операционных системах доступны механизмы IPC различного типа. Вы можете выбрать обмен сообщениями Windows, общую память, сокет, каналы и т. Д. Выберите один из них в соответствии с вашими требованиями и размером данных. Другой механизм - записывать данные в целевой процесс с использованием доступных API-интерфейсов виртуальной памяти и уведомлять процесс соответствующим указателем.

Одной простой опцией, но ограниченной формой IPC, которая бы хорошо работала для общего подсчета, является «сегмент общих данных». В Windows это реализуется с помощью директивы #pragma data_seg.

См. эту статью для примера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top