3

fork() を使用しているときに、書き込もうとしているアプリケーション全体で整数ポインターの値を更新しようとしています。理解に苦しんでいます。フォーク中に何が起こっているのでしょう。メインと同じ変数を共有していませんか? フォークで値が変更されているときに、メインの値を更新するにはどうすればよいですか。これは、私が何をしようとしているのかを理解するために作成した例です。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void changeValue(int *value)
{
  *value = *value * 2;
  printf("value in changeValue(): %d\n", *value);
}

main ()
{
  int pid;
  int *value = new int;
  *value = 10;
  printf("value in main: %d\n", *value);

  pid = fork();
  if (pid == 0) {
    changeValue(value);
    _exit(0);
  }

  sleep(2);
   // I want value = 20 here, but value stays = 10
  printf("value in main after fork(): %d\n", *value);
} 
4

3 に答える 3

3

子から親で値を更新する場合は、プロセス間通信の形式であるため、共有メモリに配置する必要があります。を使用して共有メモリを作成することをお勧めします。次に例を示します。mmap

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>

void changeValue(int *value)
{
  *value = *value * 2;
  printf("value in changeValue(): %d\n", *value);
}

int main()
{
  int pid;
  int *value = (int*)mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
  *value = 10;
  printf("value in main: %d\n", *value);

  pid = fork();
  if (pid == 0) {
    changeValue(value);
    _exit(0);
  }

  sleep(2);
   // I want value = 20 here, but value stays = 10
  printf("value in main after fork(): %d\n", *value);
} 

そしてサンプル実行:

$ ./a.out
value in main: 10
value in changeValue(): 20
value in main after fork(): 20
于 2013-08-01T02:00:15.387 に答える
2

親プロセスと子プロセスの間で通信するには、プロセス間通信 (IPC) を使用する必要があります。これを行うには、メッセージ キュー、パイプ、または共有メモリを使用できます。共有メモリを使用する場合は、セマフォなどを使用して、共有メモリの変更による相互排除を確実に行ってください。

fork() を呼び出すと、同一のプロセスが作成されますが、子は独自のメモリ空間とヒープを取得するため、変数は共有されません。そのため、プロセス間の通信には IPC を使用する必要があります。

共有メモリの使用について詳しくは、http ://www.cs.cf.ac.uk/Dave/C/node27.html をご覧ください。メッセージ キューについて詳しくは、http://www.cs.cf をご覧ください。 ac.uk/Dave/C/node25.html パイプよりもメッセージ キューを使用する方が適していますが、パイプについて詳しく知りたい場合は、https ://www.cs.rutgers.edu/~pxk/416/ を参照してください。 notes/c-tutorials/pipe.html

于 2013-08-01T02:03:07.257 に答える
0

メインと同じ変数を共有していませんか?

いいえ。呼び出しの時点でプロセスのアドレス空間のコピーを作成しますfork().

于 2013-08-01T02:00:51.927 に答える