2012-05-11 32 views
9

私のコードでforkを使用しています。私のコードでfork呼び出しを行う前に、親プロセスは宣言されたグローバル変数を持っています。したがって、フォークコールが子プロセスを実行した後、独自のスレッドスタック上にグローバル変数の個別のコピーを取得するか、グローバル変数の既存の親インスタンスを共有します。だから私はここに3つの可能性があると思います 1)子プロセスは、親プロセスで宣言されたグローバル変数の別のインスタンスを取得します 2)子プロセスは親スレッドとグローバル変数を共有します。 (おそらく真ではないかもしれません) 3)子プロセスは、親スレッドのグローバル変数に関する情報を持っていませんperlでforkを使用しているときに子プロセスと親プロセスの間で変数を共有する方法

2つまたは3つのオプションのいずれかが当てはまる場合は、グローバル変数と子プロセスの親スレッドで宣言されたfork()の実行時の状態/値。

したがって、fork()を使用して作成された子プロセスでは、変数が親プロセス変数にアクセスする方法があります。

答えて

11

各プロセスには独自のメモリ空間があります。プロセスは通常、他のプロセスのメモリにアクセスできません。

forkの場合、子プロセスのメモリ空間は、親の正確なコピーとして開始されます。これには変数、コードなどが含まれます。これらの変数のいずれかを変更しても、他の変数は変更されません。

答え#1です。


でも可能であっても、質問する必要がある質問は「変数をどのように共有するのですか」ではありません。 「どのようにデータを交換するのですか?」制御されたチャネルを有することは、カップリングが緩やかで距離が離れた動作を提供するので、エラーが起こりにくい。

パイプは多くの場合、親と子の間の通信に使用されますが、他にも多くのオプションがあります。

0

これは、「1)子プロセスが、親プロセスで宣言されたグローバル変数のインスタンスを個別に取得する」場合です。

別々のプロセスのポイントは、メモリを分離することです。フォークが発生すると、親プロセスと子プロセスの間で変数を共有することはできません。

perlipcマニュアルページには、プロセス間通信(IPC)のその他のオプションが記載されています。親子通信に関する他のStackOverflowの質問を見てください。コードの

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"; 
関連する問題