Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 叉叫工作_C_Linux_Fork - Fatal编程技术网

C 叉叫工作

C 叉叫工作,c,linux,fork,C,Linux,Fork,有人能详细解释一下叉子的工作原理吗 #include<unistd.h> #include<stdio.h> int main () { int i, b; for (i = 0; i < 2; i++) { fflush (stdout); b = fork (); if (b == -1) { perror ("error forking"); } else if (b > 0)

有人能详细解释一下叉子的工作原理吗

#include<unistd.h>
#include<stdio.h>
int main ()
{
  int i, b;
  for (i = 0; i < 2; i++) {
    fflush (stdout);
    b = fork ();
    if (b == -1) {
      perror ("error forking");
    }
    else if (b > 0)             //parent process
    {
      wait ();
      printf ("\nparent %d", getpid ());
    }
    else
      printf ("\nchild %d %d", getpid (), getppid ());
  }
  return 0;
}
#包括
#包括
int main()
{
int i,b;
对于(i=0;i<2;i++){
fflush(stdout);
b=fork();
如果(b==-1){
perror(“错误分叉”);
}
else if(b>0)//父进程
{
等待();
printf(“\n租金%d”,getpid());
}
其他的
printf(“\n归档%d%d”,getpid(),getppid());
}
返回0;
}

只是我需要知道,如果fork与父循环有相同的代码,那么这个for循环就永远不会停止创建子进程(每个子循环都有自己的for循环)

是的,每个子循环都会继续循环,但这里的关键词是“继续”。变量
i
将由第一个子级继承,然后增加,增加的值将由第二个子级继承,以此类推


同样的情况也会发生在子进程中,因为继承了
i
,并将其值保留在父进程中。这意味着循环将很快在所有子进程中结束。

当您使用
fork
时,子进程将继续执行与父进程相同的下一条指令和值

所以有一天它会停止;)


请看一个类似的问题:

是,尽管父代码和子代码相同,但在父代码中fork返回子进程id,因此在父代码中,变量b包含子进程的pid,而在子代码中,fork返回0,因此,在子代码段中,变量b将具有0,因此我们可以实现不同的作业,即使分叉在子代码段中具有相同的父代码

@mrigendra父进程的整个内存,包括变量的位置(以及值),都被复制到子进程。因此,b的值是如何改变的,在父进程中,如果是子进程的pid,则子进程应该具有相同的b值。不,
b
fork
返回后赋值,它在父进程和子进程中返回不同的值。但是,
b
在调用返回之前,在父级和子级分叉点上具有相同(未初始化)的值。并且其他子级中的值是否对这些父级有影响,例如,如果子级中的i=1,则其父级版本的i也会更新为1?@mrigendra否,继承只会“向下”,一旦父母创建了孩子,他们就完全分开了。