LinuxSir.cn,穿越时空的Linuxsir!

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

非常感谢kj501

[复制链接]
发表于 2002-11-12 00:03:04 | 显示全部楼层 |阅读模式
感谢您的关心 !
再阅读您的帖子之前 我已经将程序调试通过 而且; 运行成功!
但是还是要感谢您 的关心 和参与! 支持!
新的程序如下: (可以通过)
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void Randomnum(void);
pid_t p1,p2,p3,p4;
main(void)
{
int sysgiven=5;
  struct stares1{ int s;   char r1[11]; } statue1={0,"ABCDEFGHIJ"};
  struct stares2{ int s;   char r2[11]; } statue2={0,"KLMNOPQRST"};
  struct stares3{ int s;   char r3[11]; } statue3={0,"UVWXYZabcd"};
  struct stares4{ int s;   char r4[11]; } statue4={0,"efghijklmn"};
  struct stares5{ int s;   char r5[11]; } statue5={0,"opqrstuvwx"};  
  struct pidstatues{
                 int  name;
                 int  renum;
                 int  given;                 
                 int  nogiven;   
             }capro[4];               /* define struct over */
                                           /* initial data struct */

capro[0].name=1; capro[0].renum =3; capro[0].given=0; capro[0].nogiven=0;
capro[1].name=2; capro[1].renum =2; capro[1].given=0; capro[1].nogiven=0;  
capro[2].name=3; capro[2].renum =2; capro[2].given=0; capro[2].nogiven=0;
capro[3].name=4; capro[3].renum =4; capro[3].given=0; capro[3].nogiven=0;
  Randomnum();
if(p1<0)   {
   printf(" fork error\n ");     exit(0);   }
  else if( (p1==0) || (p1==1) )   
   {   
      if((capro[0].renum <= sysgiven) && (capro[0].nogiven<= sysgiven))
         {     
            if((statue1.s==0)&&(capro[0].given<3)) { capro[0].given++;
            sysgiven--;       printf("%s\n",statue1.r1);      statue1.s = 1; }
      if((statue2.s==0)&&(capro[0].given<3)) { capro[0].given++;         
     sysgiven--;       printf("%s\n",statue2.r2);      statue2.s = 1; }
            if((statue3.s==0)&&(capro[0].given<3)) { capro[0].given++;
             sysgiven--;       printf("%s\n",statue3.r3);      statue3.s = 1; }        
           if((statue4.s==0)&&(capro[0].given<3)) { capro[0].given++;
            sysgiven--;        printf("%s\n",statue4.r4);      statue4.s = 1; }
            if((statue5.s==0)&&(capro[0].given<3)) { capro[0].given++;
              sysgiven--;        printf("%s\n",statue5.r5);      statue5.s = 1; }
             sysgiven = 5;     exit(1);             }
   else printf(" Dead \n");
    }
if(p2<0)  
    { printf(" fork fault\n " );    exit(1);   }
else if((p2==0) || (p2==1))   
   {
       if((capro[1].renum <= sysgiven) && (capro[0].nogiven<= sysgiven))
            {
         if((statue1.s==0)&&(capro[1].given<3)) { capro[1].given++;
             sysgiven--;       printf("%s\n",statue1.r1);      statue1.s = 1; }
         if((statue2.s==0)&&(capro[1].given<3)) { capro[1].given++;   
             sysgiven--;       printf("%s\n",statue2.r2);      statue2.s = 1; }     
         if((statue3.s==0)&&(capro[1].given<3)) { capro[1].given++;
             sysgiven--;       printf("%s\n",statue3.r3);      statue3.s = 1; }   
         if((statue4.s==0)&&(capro[1].given<3)) { capro[1].given++;           
             sysgiven--;       printf("%s\n",statue4.r4);      statue4.s = 1; }
         if((statue5.s==0)&&(capro[1].given<3)) { capro[1].given++;
             sysgiven--;        printf("%s\n",statue5.r5);      statue5.s = 1; }
              sysgiven = 5;     exit(1);
             }
       else printf(" Dead \n");     
     }
if( p3<0 ) {
    printf(" fork error\n " );    exit(1);}  
    else if((p3==0) || (p3==1))
   {
     if((capro[2].renum <= sysgiven) && (capro[0].nogiven <= sysgiven))
       {   
          if((statue1.s==0)&&(capro[2].given<3)) { capro[2].given++;
             sysgiven--;       printf("%s\n",statue1.r1);      statue1.s = 1; }
          if((statue2.s==0)&&(capro[2].given<3)) { capro[2].given++;
            sysgiven--;        printf("%s\n",statue2.r2);      statue2.s = 1; }     
          if((statue3.s==0)&&(capro[2].given<3)) { capro[2].given++;
            sysgiven--;        printf("%s\n",statue3.r3);      statue3.s = 1; }   
          if((statue4.s==0)&&(capro[2].given<3)) { capro[2].given++;     
            sysgiven--;        printf("%s\n",statue4.r4);      statue4.s = 1; }  
          if((statue5.s==0)&&(capro[2].given<3)) { capro[2].given++;
            sysgiven--;        printf("%s\n",statue5.r5);      statue5.s = 1; }
              sysgiven = 5;    exit(1);     }
       else printf(" Dead \n");  }
if( p4<0 ) {
   printf(" fork error\n " );    exit(1); }
   else if((p4==0) || (p4==1))  
       {   
         if((capro[3].renum <= sysgiven) && (capro[0].nogiven <= sysgiven))
         {
              if((statue1.s==0)&&(capro[3].given<3)) { capro[3].given++;
             sysgiven--;       printf("%s\n",statue1.r1);      statue1.s = 1; }
              if((statue2.s==0)&&(capro[3].given<3)) { capro[3].given++;
             sysgiven--;       printf("%s\n",statue2.r2);      statue2.s = 1; }
              if((statue3.s==0)&&(capro[3].given<3)) { capro[3].given++;
             sysgiven--;       printf("%s\n",statue3.r3);      statue3.s = 1; }
              if((statue4.s==0)&&(capro[3].given<3)) { capro[3].given++;        
             sysgiven--;       printf("%s\n",statue4.r4);      statue4.s = 1; }     
              if((statue5.s==0)&&(capro[3].given<3)) { capro[3].given++;
             sysgiven--;       printf("%s\n",statue5.r5);      statue5.s = 1; }   
          sysgiven = 5;     exit(1);      }
         else printf(" Dead \n");  }
}
void Randomnum(void)
  {
      int i;  
      i = random();   
      i = i%4;
      switch(i){  
          case 0 :  p1 = fork();
          case 1 :  p2 = fork();
          case 2 :  p3 = fork();
          case 3 :  p4 = fork();
          default: printf("fork fault\n"); break;
        }
  }
 楼主| 发表于 2002-11-12 00:05:09 | 显示全部楼层
这是一个操作系统作业 目的是创建 四个进程 每个进程 任务是 打印 数组!  同时检测死琐!
等 问题!
 楼主| 发表于 2002-11-12 10:35:03 | 显示全部楼层
但是我想问 为什么 程序只运行到 if(p2<0) 就不在 执行 !
也就是说 当p2>0时  没有执行下面的语句 ?
发表于 2002-11-12 10:57:05 | 显示全部楼层
仔细看看这一部分:
i = random();
i = i%4;
switch(i){
case 0 : p1 = fork();
case 1 : p2 = fork();
case 2 : p3 = fork();
case 3 : p4 = fork();
default: printf("fork fault\n"); break;
我不知道你的意思是当i为1,2,3时分别产生一个进程,还是当i为1时产生3个进程,i为2 时产生2个进程,为3 时产生一个进程?如果是前者,则在每一个case语句结束后应该加上一个break语句。就象下面这样。
i = i%4;
switch(i){
case 0 : p1 = fork();break;
case 1 : p2 = fork();break;
case 2 : p3 = fork();break;
case 3 : p4 = fork();break;
default: printf("fork fault\n"); break;
 楼主| 发表于 2002-11-12 11:10:04 | 显示全部楼层
知道了 但是 为什么 当执行到:if(p2〈0)时就不执行了 ?
发表于 2002-11-12 11:59:27 | 显示全部楼层
怎么说昵,我用gdb跟踪了你的程序运行情况,发现你的程序是这样运行的:
程序开始首先执行Randomnum();由于你编写的这个函数存在问题,我只好假设它执行正常,成功产生了至少一个进程p4(pid为1597),其余的p1,p2,p3均为零。
于是程序开始执行下面的语句:
if(p1<0) {
printf(" fork error\n "); exit(0); }
由于p1为0,所以程序继续往下执行:
else if( (p1==0) || (p1==1) )
由于p1为0,再继续执行:
{
if((capro[0].renum <= sysgiven) && (capro[0].nogiven<= sysgiven))
由于capro[0].renum =3,sysgiven=5,capro[0].nogiven=0,满足条件,继续执行:
{
if((statue1.s==0)&&(capro[0].given<3))
由于statue1.s=0,capro[0].given=0,满足条件,继续执行:
{ capro[0].given++;
此时capro[0].given=1,继续往下执行:
sysgiven--;
printf("%s\n",statue1.r1);
打印执行结果:ABCDEFGHIJ
statue1.s = 1; }
if((statue2.s==0)&&(capro[0].given<3))
由于statue2.s=0,capro[0].given=1,满足条件,继续执行:
{ capro[0].given++;
此时,capro[0].given=2,继续执行:
sysgiven--;
printf("%s\n",statue2.r2);
打印执行结果:KLMNOPQRST
statue2.s = 1; }
if((statue3.s==0)&&(capro[0].given<3))
由于statue2.s=0,capro[0].given=2,满足条件,继续执行:
{ capro[0].given++;
此时capro[0].given=3,继续执行:
sysgiven--;
printf("%s\n",statue3.r3);
打印执行结果:UVWXYZabcd
statue3.s = 1; }
if((statue4.s==0)&&(capro[0].given<3))
到这里,开始出问题了,statue4.s=0,但是此时capro[0].given=3,不能满足条件,所以下面的语句就不执行了。
{ capro[0].given++;
sysgiven--; printf("%s\n",statue4.r4); statue4.s = 1; }
if((statue5.s==0)&&(capro[0].given<3)) { capro[0].given++;
sysgiven--; printf("%s\n",statue5.r5); statue5.s = 1; }
sysgiven = 5;
exit(1); }
执行到exit(1),程序返回退出码1后结束执行。这以后的语句,都不会被执行。程序的执行结果,在我的机器上是这样的:
ABCDEFGHIJ
KLMNOPQRST
UVWXYZabcd
只打印出三行执行结果,程序就结束了。所以我想你应该认真思考一下capro[0].given的作用是什么,并注意它在执行时的变化情况。
 楼主| 发表于 2002-11-12 14:06:36 | 显示全部楼层
谢谢 !
那我想让 程序继续执行 后面的语句 是不是 去掉 exit(1) ?
 楼主| 发表于 2002-11-12 14:11:39 | 显示全部楼层
对了 那为什么在我的机子上  却打印出 两对 ABCDEFGHIJ。。。。。。。。。。。。。
 楼主| 发表于 2002-11-12 14:13:18 | 显示全部楼层
对了 那为什么在我的机子上  却打印出 两对 ABCDEFGHIJ。。。。。。。。。。。。。
首先 返回子 进程 再 返回 父进程
发表于 2002-11-12 19:14:17 | 显示全部楼层
一般exit()函数只是用在程序结束或者需要程序退出执行的地方,如果需要继续执行,当然要去掉exit(),或者加上条件变成if(...) { exit(); },以免在任何情况都执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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