3

我正在尝试在使用 fork() 时在整个应用程序中更新整数指针的值。我无法理解,我想在分叉期间发生了什么。它与主要变量不共享相同的变量吗?当它们在分叉中发生变化时,我怎样才能让 main 更新它的值。这是我创建的一个示例,用于了解我想要做什么:

#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/笔记/c-tutorials/pipe.html

于 2013-08-01T02:03:07.257 回答
0

它与主要变量不共享相同的变量吗?

不,它会在调用时创建进程地址空间的副本fork().

于 2013-08-01T02:00:51.927 回答