12

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

2 つまたは 3 つのオプションのいずれかが true の場合、子プロセスの親スレッドで宣言されたグローバル変数とその「fork() の実行時の状態/値」を取得する方法があるかどうかを知りたいです。

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

4

3 に答える 3

13

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

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

ということで、答えその1です。


できたとしても、尋ねるべき質問は「変数を共有するにはどうすればよいですか?」ではありません。しかし、「データを交換するにはどうすればよいですか?」。制御されたチャネルを使用すると、結合が緩くなり、離れた場所でのアクションが少なくなるため、エラーが発生しにくくなります。

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

于 2012-05-11T04:58:40.087 に答える
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";
于 2012-05-22T09:49:33.280 に答える
1

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

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

プロセス間通信 (IPC) のその他のオプションがリストされているperlipcのマニュアル ページを参照してください。親子のコミュニケーションに関する他の StackOverflow の質問を見てください。

于 2012-05-11T08:36:59.570 に答える