Я полагаю, что ваша путаница возникает из-за непонимания взаимосвязи между адресными пространствами памяти родительского и дочернего процессов. Два адресных пространства фактически не связаны. Да, сразу после fork () два процесса содержат почти идентичные копии памяти, но вы должны думать о них как о копиях. Любые изменения, вносимые одним процессом в память в его адресном пространстве, не влияют на память другого процесса.
Любые "простые старые структуры данных" (например, предоставляемые стандартной библиотекой C ++) являются чисто абстракциями памяти, поэтому их невозможно использовать для связи между двумя процессами. Для отправки данных из одного процесса в другой необходимо использовать один из нескольких системных вызовов, которые обеспечивают межпроцессное взаимодействие.
Но обратите внимание, что разделяемая память является исключением из этого. Вы можете использовать системные вызовы для настройки раздела общей памяти, а затем создавать структуры данных в общей памяти. Вам все еще нужно будет защитить эти структуры данных с помощью мьютекса, но мьютекс должен быть осведомлен о совместной памяти. В потоках Posix вы должны использовать pthread_mutexattr_init с атрибутом PTHREAD_PROCESS_SHARED.