Как получить переменные, разделяемые между дочерним и родительским процессом при использовании 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 о родителе-ребенке связь.