当前位置:   article > 正文

linux代码实操:复制进程 fork(详解及练习)

linux代码实操:复制进程 fork(详解及练习)

fork 方法

pid_t fork(void);
函数返回类型 pid_t 实质是 int 类型,Linux 内核 2.4.0 版本的定义是:
fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。
在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1。
  1. 1. #include <stdio.h>
  2. 2. #include <stdlib.h>
  3. 3. #include <unistd.h>
  4. 4. #include <string.h>
  5. 5. #include <assert.h>
  6. 6.
  7. 7. int main(int argc, char* argv[],char* envp[])
  8. 8. {
  9. 9. char * s = NULL;
  10. 10. int n = 0;
  11. 11.
  12. 12. pid_t pid = fork();
  13. 13. assert( pid != -1 );
  14. 14.
  15. 15. if ( pid == 0 )
  16. 16. {
  17. 17. s = "child";
  18. 18. n = 4;
  19. 19. }
  20. 20. else
  21. 21. {
  22. 22. s = "parent";
  23. 23. n = 7;
  24. 24. }
  25. 25.
  26. 26. int i = 0;
  27. 27.
  28. 28. for(; i < n; i++ )
  29. 29. {
  30. 30. printf("pid=%d,n=%d,&n=%x,s=%s\n",getpid(),n,&n,s);
  31. 31. sleep(1);
  32. 32. }
  33. 33.
  34. 34. exit(0);
  35. 35. }
要注意的几个问题:
  • 父子进程并发运行的理解
  • 逻辑地址 物理地址
  • 写时拷贝技术

fork 练习

 下列程序分别输出几个“A”?

代码一:

  1. 1. int main(int argc, char* argv[],char* envp[])
  2. 2. {
  3. 3. int i = 0;
  4. 4. for( ; i < 2; i++ )
  5. 5. {
  6. 6. fork();
  7. 7. printf("A\n");
  8. 8. }
  9. 9. exit(0);
  10. 10. }

代码二:

  1. 1. int main(int argc, char* argv[],char* envp[])
  2. 2. {
  3. 3. int i = 0;
  4. 4. for( ; i < 2; i++ )
  5. 5. {
  6. 6. fork();
  7. 7. printf("A");
  8. 8. }
  9. 9. exit(0);
  10. 10. }

代码三:

  1. 1. int main()
  2. 2. {
  3. 3. fork() || fork();
  4. 4. printf("A\n");
  5. 5. exit(0);
  6. 6. }

 

解:代码一输出4个"A",代码二输出8个"A",代码三输出2个"A。

代码一的循环中,每次循环都会调用fork()函数,所以会产生2^2=4个子进程,每个子进程都会打印一个"A"。

代码二的循环中,每次循环都会调用fork()函数,所以会产生2^3=8个子进程,每个子进程都会打印一个"A"。

代码三中的fork()函数调用两次,第一次调用后会产生一个子进程,然后第二次调用后,父进程和子进程各自再产生一个子进程,所以总共会有2个子进程,每个子进程都会打印一个"A"。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/475917
推荐阅读
相关标签
  

闽ICP备14008679号