免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2783 | 回复: 9
打印 上一主题 下一主题

关于fork的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-10 13:52 |只看该作者 |倒序浏览
请问
我做了一个小例子
#include<stdio.h>
#include<sys/types.h>

int main()
{
        pid_t pid;
        int i;

        for(i=0;i<2;i++)
        {
                if( (pid=fork()) < 0)
                        fprintf(stdout, "fork error on %d\n",i);
                else if( pid > 0)
                        printf("parent fork  %d\n",i);
                else
                       
                        printf("child fork %d\n", i);
        }
       
        exit(0);
}


================================
运行的结果为
451$ a.out
child fork 0
child fork 1
parent fork  0
child fork 1
parent fork  1
parent fork  1   //?这里不清楚怎么得来的


=========================
我认为应该是这样子
i=0
fork
  (child)
  i=0
  print child
  i=1
  print child
print parent
i=1
fork
  (child)
  i=1
  print child
print parent
(就是最后只有一行 parent fork 1)



还有 这里 产生的子进程还会 调用fork()吗? 不明白请详细讲解一下
谢谢

论坛徽章:
0
2 [报告]
发表于 2006-10-10 13:56 |只看该作者
你可以在论坛里搜一下你的题目
http://bbs.chinaunix.net/viewthread.php?tid=664226&highlight=关于fork的问题
这里有个,还类似的,我想能解答你的问题。

论坛徽章:
0
3 [报告]
发表于 2006-10-10 14:39 |只看该作者
fork的本质问题;
父子进程同步问题。

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
4 [报告]
发表于 2006-10-10 14:46 |只看该作者
第一轮fork:
parent 产生:
child fork 0
parent fork  0
第二轮fork:
parent 产生:
child fork 1
parent fork  1
child产生:
child fork 1
parent fork  1

论坛徽章:
0
5 [报告]
发表于 2006-10-11 11:27 |只看该作者
原帖由 yecheng_110 于 2006-10-10 14:46 发表
第一轮fork:
parent 产生:
child fork 0
parent fork  0
第二轮fork:
parent 产生:
child fork 1
parent fork  1
child产生:
child fork 1
parent fork  1



完全同意

论坛徽章:
0
6 [报告]
发表于 2006-10-11 15:37 |只看该作者
我试了一下:
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
        pid_t pid;
        int i;

        for(i=0;i<3;i++)
        {
                if( (pid=fork()) < 0)
                        fprintf(stdout, "fork error on %d\n",i);
                else if( pid > 0)
                        printf("parent fork  %d\n",i);
                else
                        
                        printf("child fork %d\n", i);
        }
        
        exit(0);
}
执行结果:
parent fork  0
child fork 0
parent fork  1
parent fork  1
child fork 1
parent fork  2
parent fork  2
parent fork  2
child fork 1
parent fork  2
child fork 2
child fork 2
child fork 2
child fork 2
初步分析:
第一层循环3次i=0,1,2)
parent fork  0
parent fork  1
parent fork  2
child fork 0(进程1,初始i=0)
child fork 1(进程2,初始i=1)
child fork 2(进程3,初始i=2)
第二层进程1循环2次i=1,2)
parent fork  1
parent fork  2
child fork 1(进程4,初始i=1)
child fork 2(进程5,初始i=2)
第二层进程2循环1次i=2)
parent fork  2
child fork 2(进程6,初始i=2)
第三层进程4循环1次i=2)
parent fork  2
child fork 2(进程7,初始i=2)


由上我得出以下结论:
1.子进程在执行时遇到第一次fork()会跳过不执行.(所以进程i初始化为2时,一次循环,但是不创建进程)
2.子进程创建时会复制父进程当前状态下的变量值.

这两条都是避免无限循环fork下去的必要手段.
特别是第二条,在循环fork进程时保证避免无限循环.

以上是个人看法,不知道对不对,还请达人指正!

论坛徽章:
0
7 [报告]
发表于 2006-10-11 16:36 |只看该作者
看看这个就知道了

  1. #include<stdio.h>
  2. #include<sys/types.h>

  3. int main()
  4. {
  5.         pid_t pid;
  6.         int i;

  7.         for(i=0;i<2;i++)
  8.         {
  9.                 if( (pid=fork()) < 0)
  10.                         fprintf(stdout, "fork error on %d\n",i);
  11.                 else if( pid > 0)
  12.                         printf("pid=%d,parent fork  %d\n",getpid(),i);
  13.                 else

  14.                         printf("pid=%d,child fork %d\n", getpid(),i);
  15.         }

  16.         exit(0);
  17. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2006-10-11 16:37 |只看该作者
子进程又fork出孙子进程的缘故

论坛徽章:
0
9 [报告]
发表于 2006-12-21 11:48 |只看该作者
原帖由 cuicp 于 2006-10-11 15:37 发表
我试了一下:
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
        pid_t pid;
        in ...

兄弟,在结合楼上兄弟的语句,用getpid()将id打出,我分析后,你的说法是正确的!

但我还有问题,就是fork后,子进程的运行是从main开始的,如果在fork前有其他的函数,那么子函数也是同样会去执行,可在有的帖子中,比如有printf()语句,去怎么会和缓存机制有关,是问,既然子进程都是独立的,那它运行printf,就肯定有输出,这还和父进程有什么关系??

论坛徽章:
0
10 [报告]
发表于 2006-12-21 12:40 |只看该作者
发现一个问题!
源程序:
  1. // fork.c
  2. #include<stdio.h>
  3. #include<sys/types.h>

  4. int main()
  5. {
  6.         pid_t pid;
  7.         int i;

  8.         printf("Main pid=%d, parent pid=%d\n", getpid(), getppid());
  9.         for(i=0;i<2;i++)
  10.         {
  11.                 if( (pid=fork()) < 0)
  12.                         fprintf(stderr, "fork error on %d\n",i);
  13.                 else if( pid > 0)
  14.                         printf("pid=%d, parent pid=%d, parent fork  %d\n",getpid(),getppid(),i);
  15.                 else

  16.                         printf("pid=%d, parent pid=%d, child fork %d\n", getpid(),getppid(),i);
  17.         }

  18.         exit(0);
  19. }
复制代码

输出:
$ ./fork
Main pid=2020, parent pid=2676
pid=2044, parent pid=2020, child fork 0
pid=2020, parent pid=2676, parent fork  0
pid=2044, parent pid=2020, parent fork  1
pid=564, parent pid=1, child fork 1
pid=2476, parent pid=2020, child fork 1
pid=2020, parent pid=2676, parent fork  1

$ ps
      PID    PPID    PGID     WINPID  TTY  UID    STIME COMMAND
     2676       1    2676       2676  con 1003 12:18:34 /usr/bin/bash
     2996    2676    2996       2948  con 1003 12:29:38 /usr/bin/ps
pid=564, parent pid=1, child fork 1

pid = 1的进程是什么进程? 为什么bash的父进程也是pid = 1呢?(我在Cygwin里测试的)

[ 本帖最后由 tyc611 于 2006-12-21 13:07 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP