for循环中两个fork()后打印结果+分析 例1

之前刷到过这样一个Linux下关于fork()的问题,问了俺老师后茅塞顿开。希望可以帮到大家。首先是俺的代码:

首先getppid()是获取父进程pid号,而getpid是获取当前进程pid号。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
  char *word;
  for (int i = 0; i < 2; i++) {
    pid_t pid = fork();
    if (pid == -1) {
      exit(1);
    }
    if (pid == 0) {
      word = "子进程";
      printf("ppid=%4d,pid=%4d,进程=%s\t\n", getppid(), getpid(), word);
    } else {
      word = "父进程";
      printf("ppid=%4d,pid=%4d,进程=%s,\n", getppid(), getpid(), word);
    }
  }
}

问题是,共打印了几次进程呢。(我做了一些修改,但是打印的次数时是不变的)。

当程序执行到fork()的时候,会复制相同的一个进程出来(所有代码和变量的值)。如左图,红色的是最初时的进程,黄色是当i=0执行到fork()的时候复制的子进程,之后的黄色和绿色同上。

程序执行的结果如下

 

 当然,我们看执行结果可以看到。最后两行代码,子进程的是从各自父进程复制而来的,本来应该是7***,但是变成了1,为什么呢?

我们引出了孤儿进程的概念,当父进程结束了之后。子进程没有亲人了,而Linux会有一个孤儿院来存储他,32位和64位操作系统的孤儿院不相同,俺的vscode和在bash中运行也不相同。(如果想在windows下和Linux虚拟机进行连接移步到博主之前的博客)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
父进程: ```python import os, time pid = os.fork() if pid == 0: print("son process start") time.sleep(1) for i in range(10): print("son") time.sleep(1) print("son process end") else: print("father process start") time.sleep(1) pid2 = os.fork() if pid2 == 0: print("daughter process start") time.sleep(2) for i in range(10): print("daughter") time.sleep(2) print("daughter process end") else: print("father continue") time.sleep(1) for i in range(10): print("father") time.sleep(1) print("father process end") ``` 运行结果如下: ``` father process start father continue son process start father father son father daughter process start father son father daughter son father daughter son father daughter son father daughter son father daughter son father daughter son father daughter process end son process end father process end ``` 在父进程,我们先使用`os.fork()`开启一个子进程。在子进程,我们先让它打印出一段话,为了更好的观察进程的执行,我们使用了`time.sleep()`来暂停进程一秒钟。接下来,子进程1要打印出“son”十遍,我们同样使用`time.sleep()`来暂停进程,并且在打印完“son”之后再次使用`time.sleep()`来暂停一秒钟,以确保具有更好的阅读体验。 在父进程,我们另外开启了一个子进程,子进程2。在子进程2,我们打印一段话,此时我们暂停两秒钟,以使子进程2执行比较慢。在接下来的代码,我们同样使用`time.sleep()`来暂停进程,并且在打印完“daughter”之后再次使用`time.sleep()`来暂停两秒钟,以确保具有更好的阅读体验。 在父进程,我们使用了一个循环打印10次"father",使用`time.sleep()`来暂停一秒钟,然后在子进程1,我们同样使用了一个循环打印10次“son”,使用`time.sleep()`来暂停一秒钟。在子进程2,我们同样使用了一个循环打印10次“daughter”,使用`time.sleep()`来暂停两秒钟。 运行结果显示,四个进程运行顺序如下: 1. father process start 2. father continue 3. son process start 4. daughter process start 5. father 6. son 7. daughter 8. son 9. father 10. daughter 11. son 12. father 13. daughter 14. son 15. father 16. daughter 17. son 18. father 19. daughter 20. son 21. father 22. daughter process end 23. son process end 24. father process end 我们发现,父进程首先执行,然后又开启了两个子进程,他们的顺序是不确定的。当父进程打印出“father”时,子进程1和子进程2正在进行。这个子展示了进程的并发执行,其演示了每个进程打印出自己的名称并sleep()一段时间的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值