2013-07-02 109 views
1

我和这个小程序的一个问题:计数器增加()

int main() { 

    pid_t process; 
    int count= 0; 

    switch(process= fork()) { 

    case -1: 
     printf("Fork error!\n\n"); 
     exit(1); 
    break; 

    case 0: //child 
     printf("Process CHILD: PID= %d, Value= %d \n", getpid(), process); 
     printf("Coounter NOT increased: %d\n", count); 
     printf("Increase counter...\n"); 
     sleep(2); 
     count= count + 2; 
     printf("Counter increased: %d\n\n", count); 
     exit(0); 
    break; 

    default: //parent 
     wait(0); 
     printf("Process PARENT: PID= %d, Value= %d\n", getpid(), process); 
     printf("Counter value: %d\n\n", count); 
    break; 
    } 
    return 0; 
} 

我增加计数器的孩子,但在父计数没有增加,为什么?

谢谢大家

回答

2

当你做对叉它会创建一个新的子进程。新的子进程拥有自己的内存,堆栈,本地/全局变量空间。

两个过程从那里叉callled同一点开始执行,但具有不同的存储空间。所以一个进程的内存变化不会反映在其他进程中。

,如果你想用两个进程之间相同的内存,你可以使用的情况下,共享内存。

另一种方法是你可以从子进程的变量值重定向到标准输出流,并从父进程读取它。

4

因为父母和孩子都没有在同一个进程中运行。

用于可变的存储器是在每个过程中的不同。顺便说一下,这是过程的要点。

如果您真的想在进程或线程中执行此操作,只需要在单个进程的内存中进行多处理,请查看“shared memory”。

6

这是因为在fork之后,父进程和子进程是不同的进程,并且它们每个都有自己的变量副本count

3

因为当你fork时,过程映像被复制。与线程不同,修改全局变量的一个进程不会影响其他进程。这实际上是在许多情况下使用多个进程的好处之一。实际上,可以使用写入时复制来消除实际的复制,但是当您在子中增加计数器时,必须进行复制,以便父代不会看到它。

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

int count= 0; 

int main() { 

    pid_t process; 


    switch(process= fork()) { 

    case -1: 
     printf("Fork error!\n\n"); 
     exit(1); 
    break; 

    case 0: //child 
     printf("Process CHILD: PID= %d, Value= %d \n", getpid(), process); 
     printf("Coounter NOT increased: %d\n", count); 
     printf("Increase counter...\n"); 
     sleep(2); 
     count= count + 2; 
     printf("Counter increased: %d\n\n", count); 
     exit(0); 
    break; 

    default: //parent 
     wait(0); 
     printf("Process PARENT: PID= %d, Value= %d\n", getpid(), process); 
     printf("Counter value: %d\n\n", count); 
    break; 
    } 
    return 0; 
}