C 遏止儿童及青少年失业人数上升;具有fork()的父对象
我对这个小程序有个问题:C 遏止儿童及青少年失业人数上升;具有fork()的父对象,c,linux,fork,C,Linux,Fork,我对这个小程序有个问题: 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(),
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;
}
我增加了孩子的计数器,但在家长的计数器不增加。。。为什么?
谢谢大家因为父进程和子进程不在同一进程中运行 在每个进程中,用于变量的内存是不同的。顺便说一句,这就是过程的要点
如果您真的想对进程执行此操作,请查看“”,如果您只想在单个进程的内存中执行多个处理,请查看线程。因为父进程和子进程不在同一进程中运行 在每个进程中,用于变量的内存是不同的。顺便说一句,这就是过程的要点
如果您真的想对进程执行此操作,请查看“”,如果您只想在单个进程的内存中执行多个处理,请查看线程。这是因为在
fork
之后,父进程和子进程是不同的进程,它们都有自己的变量count
副本,这是因为在fork
之后,父进程和子进程是不同的进程,它们都有自己的变量count副本,因为当您fork时,进程映像被复制。与线程不同,一个进程修改全局变量不会影响另一个进程。这实际上是在许多情况下使用多个流程的好处之一。事实上,写入时复制可以用来消除实际的复制,但是当您增加子进程中的计数器时,必须进行复制,以便父进程看不到它。因为当您分叉时,进程映像被复制。与线程不同,一个进程修改全局变量不会影响另一个进程。这实际上是在许多情况下使用多个流程的好处之一。事实上,写时复制可以用来消除实际的复制,但是当您增加子进程中的计数器时,必须进行复制,以便父进程看不到它。当您执行fork时,它将创建一个新的子进程。新的子进程有自己的内存、堆栈、局部/全局变量空间
这两个进程从调用fork的同一点开始执行,但内存空间不同。所以一个进程的内存变化不会反映在另一个进程中
如果要在两个进程之间使用相同的内存,可以使用共享内存
另一种方法是,您可以将变量值从子进程重定向到标准输出流,并从父进程读取它。执行fork操作时,它将创建一个新的子进程。新的子进程有自己的内存、堆栈、局部/全局变量空间
#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;
}
这两个进程从调用fork的同一点开始执行,但内存空间不同。所以一个进程的内存变化不会反映在另一个进程中
如果要在两个进程之间使用相同的内存,可以使用共享内存
另一种方法是,您可以将变量值从子进程重定向到标准输出流,并从父进程读取
#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;
}
#包括
整数计数=0;
int main(){
pid_t过程;
开关(进程=fork()){
案例1:
printf(“分叉错误!\n\n”);
出口(1);
打破
案例0://儿童
printf(“进程子进程:PID=%d,值=%d\n”,getpid(),进程);
printf(“计数器未增加:%d\n”,计数);
printf(“增加计数器…\n”);
睡眠(2);
计数=计数+2;
printf(“计数器增加:%d\n\n”,计数);
出口(0);
打破
默认值://parent
等待(0);
printf(“进程父级:PID=%d,值=%d\n”,getpid(),进程);
printf(“计数器值:%d\n\n”,计数);
打破
}
返回0;
}
#包括
#包括
整数计数=0;
int main(){
pid_t过程;
开关(进程=fork()){
案例1:
printf(“分叉错误!\n\n”);
出口(1);
打破
案例0://儿童
printf(“进程子进程:PID=%d,值=%d\n”,getpid(),进程);
printf(“计数器未增加:%d\n”,计数);
printf(“增加计数器…\n”);
睡眠(2);
计数=计数+2;
printf(“计数器增加:%d\n\n”,计数);
出口(0);
打破
默认值://parent
等待(0);
printf(“进程父级:PID=%d,值=%d\n”,getpid(),进程);
printf(“计数器值:%d\n\n”,计数);
打破
}
返回0;
}