Как получить переменные, разделяемые между дочерним и родительским процессом при использовании fork в perl

Я использую fork в своем коде. Перед вызовом fork в моем коде родительский процесс объявляет глобальную переменную. Таким образом, после вызова fork дочерний процесс получает отдельную копию глобальной переменной в собственном стеке потоков или разделяет существующий Родительский экземпляр глобальной переменной. Итак, я думаю, здесь есть три возможности 1) дочерний процесс получает отдельный экземпляр глобальной переменной, объявленной в Родительском процессе 2) дочерний процесс разделяет глобальную переменную с родительским потоком. (который возможно, это неправда.) 3) дочерний процесс не имеет искомой информации о глобальной переменной в Родительском потоке

Если 2 или 3 параметра истинны, я хочу знать, есть ли способ получить глобальную переменную и ее "состояние/значение во время выполнения fork ()", объявленные в Родительском потоке, в дочернем процессе.

так широко, есть ли способ доступа к переменной родительских процессов и состояний в дочернем процессе, созданном с помощью fork ().

3 ответов


каждый процесс имеет свое собственное пространство памяти. Процесс обычно не может получить доступ к памяти другого процесса.

в случае fork, пространство памяти дочернего процесса начинается как точная копия родителей. Это включает переменные, код и т. д. Изменение любого из них в одном не изменит аналогичную переменную в другом.

Итак, это ответ №1.


даже если бы вы могли, вопрос, который вы должны задать, не "как мне поделиться переменной?"но "как Обмен данными?". Наличие контролируемого канала менее подвержено ошибкам, поскольку оно обеспечивает более слабое соединение и меньшее действие на расстоянии.

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


пример кода:

my $ipckey = IPC_PRIVATE;
my $idshm = shmget( $ipckey, 200, 0666 ) || die "\nCreation shared memory failed $! \n";

shmread( $idshm, $xxx, 0, 1 ) || warn "\n\n shmread $! \n";

shmwrite( $idshm, $xxx , 0, 1 ) || warn "\n\n shmwrite $! \n";

Это случай "1) дочерний процесс получает отдельный экземпляр глобальной переменной, объявленной в Родительском процессе".

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

вы должны взглянуть на perlipc ручная страница, в которой перечислены некоторые другие параметры межпроцессной связи (IPC). И посмотрите на другие вопросы StackOverflow о родителе-ребенке связь.