Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 遏止儿童及青少年失业人数上升;具有fork()的父对象_C_Linux_Fork - Fatal编程技术网

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;
}