LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 885|回复: 4

灵异问题

[复制链接]
发表于 2010-3-10 17:34:28 | 显示全部楼层 |阅读模式
先看代码,很简单
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <sys/wait.h>

  5. int i;

  6. int main()
  7. {
  8.         int  newpid;
  9.         void child_code(), parent_code();
  10.         int count = 3;
  11.         for ( i = 0; i < count; ++i ){
  12.                 if ( (newpid = fork()) == -1 )
  13.                         perror("fork");
  14.                 else if ( newpid == 0 )
  15.                         child_code();
  16.                 else
  17.                         parent_code(newpid);
  18.         }
  19.         return 0;
  20. }
  21. /*
  22. * new process takes a nap and then exits
  23. */
  24. void child_code()
  25. {
  26.         exit(17);
  27. }
  28. /*
  29. * parent waits for child then prints a message
  30. */
  31. void parent_code(int childpid)
  32. {
  33.         int wait_rv;                /* return value from wait() */
  34.         wait_rv = wait(NULL);
  35.         printf ( "the No.%d child has down\n", i );
  36. }
复制代码


编译生成a.out
  1. ./a.out
复制代码

结果
  1. the No.0 child has down
  2. the No.1 child has down
  3. the No.2 child has down
复制代码

接下来这么执行
  1. ./a.out > testfile
  2. more testfile
复制代码

结果
  1. the No.0 child has down
  2. the No.0 child has down
  3. the No.1 child has down
  4. the No.0 child has down
  5. the No.1 child has down
  6. the No.2 child has down
复制代码

也就是说把输入重定向到文件就会初见这么个结果……
why?
发表于 2010-3-10 21:58:57 | 显示全部楼层
输出六次的结果才是正确的。
现象产生的原因应该是执行时间长短不同造成的,写console增加了执行时间。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-3-11 09:05:13 | 显示全部楼层
为什么6次的结果才是正确的??
我感觉是3次,应该只建立3个子进程啊?
回复 支持 反对

使用道具 举报

发表于 2010-3-11 10:20:04 | 显示全部楼层
复制出的子进程仍然会调用fork,所以结果就是3+2+1。如果count为4,那么就是4+3+2+1。
这个是个经典问题,叫做fork之树。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-3-11 14:12:16 | 显示全部楼层
Post by realtang;2074619
复制出的子进程仍然会调用fork,所以结果就是3+2+1。如果count为4,那么就是4+3+2+1。
这个是个经典问题,叫做fork之树。


哦对,我为了简便起见没有调用exec。
不过那为什么向屏幕写的时候就只写出来三行呢?

另外调用exec的时候,可执行程序的指令是从哪里开始覆盖父进程的代码的?是从fork之后开始覆盖吗?那之前那部分代码怎么办?还是存在于内存?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表