LinuxSir.cn,穿越时空的Linuxsir!

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

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

[复制链接]
发表于 2003-6-15 21:44:12 | 显示全部楼层

  1.       if(cpid==0)
  2.       {
  3.         pid[i]=getpid();
  4.         break;
  5.       }
  6.       else
  7.         continue;
复制代码


Child process stores its pid into pid[x], remeber each process has its own memory pid[], the result will be parent process' pid[] is { x, 0, 0, 0 }, am I right?

  1. if (cpid == 0)
  2. {
  3.     // this is child process
  4.     break;
  5. }
  6. else
  7. {
  8.     pid[i] = cpid;
  9. }
复制代码


colored, why not just libinary's code ???
发表于 2003-6-15 21:58:41 | 显示全部楼层
这段程序编译通不过,主要是case pid[x]:,pid[x]不是一个整形常量。
 楼主| 发表于 2003-6-15 22:08:15 | 显示全部楼层
parent process' pid[] is { parent_pid, 0, 0 }
child1 process' pid[] is { parent_pid, child1_pid, 0 }
child2 process' pid[] is { parent_pid, 0, child2_pid }
发表于 2003-6-15 22:09:38 | 显示全部楼层
另外:

  1. pid_t pid[NUM];
  2. for(i=0;i<NUM;i++)
  3.   pid[i]=(pid_t) 0;
复制代码

这种初始化代码可以写成:
pid_t pid[NUM] = {0};
C语言中初始化数组的时候,没有指定的元素就初始化为0,比如:
int a[10] = {1, 2, 3};
后面的7个元素就初始化为0,象int a[10] = {0};就可以把a都初始化为0,当然,初始化表达式一定要有,如果光是int a[10],没有初始化表达式,C就不进行初始化。
 楼主| 发表于 2003-6-15 22:15:51 | 显示全部楼层
最初由 libinary 发表
这段程序编译通不过,主要是case pid[x]:,pid[x]不是一个整形常量。


改成:
case (int) pid[x]:
  //...

不知行不行

我现在不在linux下,无法测试
发表于 2003-6-26 11:44:10 | 显示全部楼层

回复: 也写一段代码

最初由 colored 发表
  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)        //如果子进程也创建了子子进程的话,那它将成为一个新的父进程,那它得到的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. }
复制代码

colored 按照你这里的做法,你是不是创建了很多个子进程。但实际用到的只有五个?
 楼主| 发表于 2003-6-27 20:39:26 | 显示全部楼层
重写代码,并编译通过
  1. /* testforks.c */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #define NUM 4
  6. int main()
  7. {
  8.         pid_t pid[NUM]={0},cpid;
  9.         int i;
  10.         pid[0]=getpid();//父进程
  11.         for(i=1;i<NUM;i++)
  12.         {
  13.             if((cpid=fork())==-1)//子进程
  14.             {
  15.               printf("fork error!\n");
  16.               exit(1);
  17.             }
  18.             else
  19.               if(cpid==0)//如果是子进程,则跳出循环,父进程则继续循环,生成子进程
  20.              {
  21.                 pid[i]=getpid();
  22.                 break;
  23.               }
  24.         }
  25. //所有进程都运行以下代码
  26.         cpid=getpid();
  27.         if(cpid==pid[0])
  28.         {
  29.                 printf("parent cpid=%d\n",cpid);
  30.                 for(i=0;i<NUM;i++)
  31.                         printf("pa pid[%d]=%d\t",i,pid[i]);
  32.                 printf("\n");
  33.         }
  34.         if(cpid==pid[1])
  35.         {
  36.                 printf("child 1# cpid=%d\n",cpid);
  37.                 for(i=0;i<NUM;i++)
  38.                         printf("1# pid[%d]=%d\t",i,pid[i]);
  39.                 printf("\n");
  40.         }
  41.         if(cpid==pid[2])
  42.         {
  43.                 printf("child 2# cpid=%d\n",cpid);
  44.                 for(i=0;i<NUM;i++)
  45.                         printf("2# pid[%d]=%d\t",i,pid[i]);
  46.                 printf("\n");
  47.         }
  48.         if(cpid==pid[3])
  49.         {
  50.                 printf("child 3# cpid=%d\n",cpid);
  51.                 for(i=0;i<NUM;i++)
  52.                         printf("3# pid[%d]=%d\t",i,pid[i]);
  53.                 printf("\n");
  54.         }
  55.         return 1;
  56. }
复制代码
 楼主| 发表于 2003-6-27 20:40:30 | 显示全部楼层
运行载图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2003-6-27 21:25:56 | 显示全部楼层
colored兄。你这样不停地用if,不是太灭绝性了吗?而且每次都把所有的pid打印出来,不如只打印子进程所在的那一个。我的代码是:
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #define NUM 5
  4. main()
  5. {
  6. int i;
  7. int pid[5],cpid;[color=red]//改成int *pid就不行了,说是段错误。但如果你看我另一贴的话,我是用int *pid。不会提示段错误[/color]
  8. for(i=0;i<NUM;i++)
  9.         {
  10.         if((cpid=fork())==-1)
  11.                 {
  12.                 perror("fork error!");
  13.                 exit(1);
  14.                 }
  15.         else
  16.         if(cpid==0)
  17.         {
  18.         *(pid+i)=getpid();
  19.         break;
  20.         }
  21.         else
  22.         continue;
  23.         }
  24. for(i=0;i<NUM;i++)
  25.         {
  26.         cpid=getpid();
  27.         if(cpid==*(pid+i))
  28.         printf("The pid of No %d:%5d\n",i,cpid);
  29.         }
  30. }
复制代码
这几天我给弄得头晕脑涨的。
你的图片是怎么弄上去的?
 楼主| 发表于 2003-6-27 22:09:35 | 显示全部楼层
最初由 0100 发表
colored兄。你这样不停地用if,不是太灭绝性了吗?


;)你所做的是让所有的进程做同样一件事
最初由 0100 发表
而且每次都把所有的pid打印出来,不如只打印子进程所在的那一个。

这个属于细节问题(我以为可以更好的了解前面的fork是如何工作的。)
关键是:现在可以知道如何生成多个平行子进程,以及他们是如何同时工作的了。
最初由 0100 发表
你的图片是怎么弄上去的?

就在帖子回复中有附件,你点浏览就知道了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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