2013-08-01 17 views
3

我尝试在使用fork()时更新整个应用程序im中的整数指针值。我无法理解,我想在叉子里发生了什么。它不会与主共享相同的变量吗?我怎么能让主要更新它的值,当他们在叉中变化。这里是我的什么我尝试做一个想法,创建了一个例子:在Linux中使用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); 
} 

回答

3

如果你希望值从孩子家长进行更新,你必须把它放在shared memory因为这是进程间通信的一种形式。我建议使用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 
+1

**美丽!!谢谢!!保存我!! ** – ArmYourselves

+1

只是我在手册页上阅读:MAP_ANON似乎被弃用;使用MAP_ANONYMOUS来代替(参见[mmap](http://linux.die.net/man/2/mmap)) –

0

它不会从主共享相同的变量?

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

+1

谢谢,这有助于! – ArmYourselves

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

+1

谢谢,这是有见地的! – ArmYourselves

+0

没问题的人。 – P4T4R