LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: colored

[c]关于fork()前后进程的运行

[复制链接]
发表于 2003-6-13 14:23:21 | 显示全部楼层
case里面别忘了加exit(0),否则第一个子进程会继续循环,再创建一个子进程。
发表于 2003-6-15 15:55:52 | 显示全部楼层
你再看看我的源代码:
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. main()
  4. {
  5. int i,j;
  6. int pid1,pid2;
  7. for(i=0;i<2;i++)
  8.         {
  9.         switch (i)
  10.                 {
  11.         case 0:{if((pid1=fork())==-1)  perror("fork error!");
  12.                 else
  13.                 if(pid1==0)
  14.                 printf("This is the first procedure!\n");
  15.                 exit(0);break;}
  16.         case 1:{if((pid2=fork())==-1)  perror("fork error!");
  17.                 else
  18.                 if(pid2==0)
  19.                 printf("This is the second procedure!");
  20.                 exit(0);break;}
  21.                 }
  22.         }
  23. }
复制代码
但运行后,只有一个This is the first procedure!
怎么回事啊?第二个怎么没有打印出来呢?
发表于 2003-6-15 17:50:55 | 显示全部楼层

  1. if(pid1==0)
  2.   printf("This is the first procedure!\n");
  3. exit(0);
复制代码

应该是:

  1. if(pid1==0){
  2.   printf("This is the first procedure!\n");
  3.   exit(0);
  4. }
复制代码

否则父进程和子进程运行到exit(0)都结束了。
发表于 2003-6-15 20:23:11 | 显示全部楼层
我真笨啊。我只知道冬天是没有^^^^^^
没想到居然是这么笨的错误。
发表于 2003-6-15 21:02:08 | 显示全部楼层
楼上的兄弟应该学会调试程序,用gdb跟踪一下就很清楚了。
 楼主| 发表于 2003-6-15 21:05:47 | 显示全部楼层

也写一段代码


  1. #define NUM 3
  2. int main()
  3. {
  4. pid_t pid[NUM],cpid;
  5. int i;
  6. for(i=0;i<NUM;i++)
  7.   pid[i]=(pid_t) 0;
  8. pid[0]=getpid()://父进程
  9. for(i=1;i<NUM;i++)
  10. {
  11.     if((cpid=fork())==-1);//子进程
  12.     {
  13.       pritf("fork error!");
  14.       exit(1);
  15.     }
  16.     else
  17.       if(cpid==0)
  18.       {
  19.         pid[i]=getpid();
  20.         break;
  21.       }
  22.       else
  23.         continue;
  24. }
  25.    
  26. cpid=getpid();
  27. switch(cpid)
  28. {
  29.   case pid[0]://父进程
  30.     //write your code
  31.     break;
  32.   case pid[1]://子进程1
  33.     //....
  34.     break;
  35.   case pid[2]://子进程2
  36.     //....
  37.    break;
  38. }
  39. }
复制代码
发表于 2003-6-15 21:24:38 | 显示全部楼层

回复: 也写一段代码

这段代码有问题

  1. #define NUM 3
  2. int main()
  3. {
  4. pid_t pid[NUM],cpid;
  5. int i;
  6. pid[0]=getpid()://父进程
  7. for(i=1;i<NUM+1,i++) [color=red]/* 不应该是NUM+1,应该是NUM,否则就成了i<4,
  8.                       * 当i=3的时候还要进行循环 */[/color]
  9.   pid[i]=fork();//子进程 [color=red]/* 父进程第一次fork产生了子进程一,再次循环的时候,
  10.                           * 父进程产生子进程二,而子进程一也产生了一个子子进程 */[/color]
  11.   cpid=getpid();
  12.   switch(cpid)
  13.   {
  14.   case pid[0]://父进程
  15.     //write your code
  16.     break;
  17.   case pid[1]://子进程1
  18.     //....
  19.     break;
  20.   case pid[2]://子进程2
  21.     //....
  22.    break;
  23.   }
  24. }
复制代码
 楼主| 发表于 2003-6-15 21:31:14 | 显示全部楼层

已经看出来了

正在改正ing
 楼主| 发表于 2003-6-15 21:33:04 | 显示全部楼层

改正完毕

请指正
发表于 2003-6-15 21:38:20 | 显示全部楼层
第一个问题可以看一下《C陷阱与缺陷》第三章,有一段讲“不对称边界”的,讲的非常好。
第二个问题主要要搞清楚fork调用以后进程的状况(我主要从代码的角度来讲),此时有父子两个进程,他们的代码是一样的,变量的值也一样,运行的位置也一样(fork之后),比如你的代码,此时父子进程的i都等于1,都满足循环条件,所以,父子进程都要继续循环继续fork,各产生一个子进程。
一般在fork之后用if(pid == 0)就是为了把父子进程的执行路径分开。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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