当前位置:   article > 正文

使用fork()函数,父子进程代码执行逻辑的经典示例

使用fork()函数,父子进程代码执行逻辑的经典示例

实验结论:

1 fork前的代码,只由父进程执行一次

2 fork后子进程中的代码{},只由子进程执行

   fork后父进程的代码{},只由父进程执行

3 fork后的代码,因子子进程复制了父进程的代码段,所以父子进程各执行一次

特别地:

1 如果将execlp(任意exec*函数族)开启并成功执行,代码段将立即从此处立即被替换

   也就是说after fork语句和后面的子进程代码都不会执行

2  如果将exit在子进程中开启,代码段将立即从此处截断并返回父进程

   也就是说after fork语句和exit后的子进程代码都不会执行

  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <sys/wait.h>
  5. #include <string.h>
  6. int main()
  7. {
  8. // fork前的代码,只由父进程执行一次
  9. printf("%d:Before fork\n", getpid());
  10. pid_t pid = fork();
  11. if (pid == 0)
  12. {
  13. // fork后子进程中的代码{},只由子进程执行
  14. printf("%d:Child process\n", getpid());
  15. // 如果将execlp(任意exec*函数族)开启并成功执行代码段将立即从此处立即被替换
  16. // 也就是说after fork和后面的子进程代码都不会执行
  17. // execlp("ls", "ls", "-l", NULL);
  18. // 如果将exit开启代码段将立即从此处截断
  19. // 也就是说after fork和exit后的子进程代码都不会执行
  20. // exit(EXIT_SUCCESS);
  21. }
  22. else if (pid > 0)
  23. {
  24. // 父进程等待子进程结束,严谨
  25. wait(NULL);
  26. // fork后父进程的代码{},只由父进程执行
  27. printf("%d:Parent process\n", getpid());
  28. }
  29. else
  30. {
  31. // 出错
  32. perror("fork");
  33. }
  34. // fork后的代码,因子子进程复制了父进程的代码段,所以父子进程各执行一次
  35. printf("%d:After fork\n", getpid());
  36. return 0;
  37. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号