我对这个小程序有疑问:
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;
}
我增加了孩子的计数器但是在父母的计数器没有增加......为什么?
谢谢大家
答案 0 :(得分:6)
那是因为在fork
之后,父进程和子进程是不同的进程,并且每个进程都有自己的变量count
。
答案 1 :(得分:4)
因为父母和孩子没有在同一个过程中运行。
每个进程中用于变量的内存不同。顺便说一下,这是流程的重点。
如果您真的想用进程执行此操作,请查看“shared memory”,如果您只想在单个进程的内存中进行多处理,请查看线程。
答案 2 :(得分:3)
因为在fork时,会复制过程映像。与线程不同,修改全局变量的一个进程不会影响另一个进程。这实际上是在许多情况下使用多个进程的好处之一。事实上,写时复制可以用来消除实际的复制,但是当你在孩子中增加计数器时,必须复制一份,这样父母才能看到它。
答案 3 :(得分:2)
当您执行fork时,它将创建一个新的子进程。 New Child进程拥有自己的内存,堆栈,本地/全局变量空间。
两个进程从fork调用的同一点开始执行,但具有不同的内存空间。因此,一个进程的内存更改不会反映在其他进程中。
如果你想在两个进程之间使用相同的内存,你可以使用共享内存。
另一种方法是,您可以将变量值从子进程重定向到标准输出流,并从父进程读取它。
答案 4 :(得分: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;
}