-1

我正在尝试运行 C 程序。它似乎工作正常,但最后它显示:

检测到堆栈破坏

这是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

extern int errno;

int main(int argc, char *argv[]){  /*Para pasar argumentos a la funcion main*/

char id[7]="\0";       
char orden[10]="\0";   
char arg[3]="\0";
char idhijo[7]="\0";      
char ordenhijo[10]="\0";   
char arghijo[3]="\0";

int i=0, j=0, k=0;

int a=1, pipe1[2], pipe2[2], control, argument=0, status, posx=50, posy=50, s, t, arg_val=0, orden_val=0;

FILE *fichero;

char mensaje1[4], mensaje2[4], mensaje3[6];
char posxpadre[4]="50", posypadre[4]="50", hijoPID[4];

system("clear");

control = pipe(pipe1);
if(control !=0){

perror("pipe1");
exit(errno);
}

control = pipe(pipe2);
if(control !=0){

perror("pipe2");
exit(errno);
}

control = fork();                            

fichero=fopen(argv[1], "r");
if (fichero){

while((i != EOF) && (j != EOF) && (k != EOF)){


if((i != EOF) && (j != EOF)  && (k != EOF)){

     if (control ==-1){

     perror("fork");
     exit(errno);

  }


  if (control !=0){


        k=fscanf(fichero, "%s", id);
        i=fscanf(fichero, "%s", orden);
        j=fscanf(fichero, "%s", arg);


        if(Robot_valido(id)){  

            write(pipe1[1], id, 7);
                write(pipe1[1], arg, 3);
                write(pipe1[1], posxpadre, 4);            
                write(pipe1[1], posypadre, 4);
                write(pipe1[1], orden, 10);

            read(pipe2[0], posxpadre, 4);
            read(pipe2[0], hijoPID, 6);
            read(pipe2[0], posypadre, 4);            

            printf("Hijo con PID %s desplazo el robot a la posicion: (%s, %s)\n\n", hijoPID, posxpadre, posypadre);

            }
 }

else{

    read(pipe1[0], idhijo, 7);
    read(pipe1[0], arghijo, 3);
    read(pipe1[0], posxpadre, 4);
    read(pipe1[0], posypadre, 4);
    read(pipe1[0], ordenhijo, 10);

    if (Robot_valido(idhijo)!=0){

        Orden_valida(ordenhijo, arghijo, &orden_val, &arg_val);

        if (orden_val !=0 && arg_val !=0){

            argument=atoi(arghijo);
            posy=atoi(posypadre);
            posx=atoi(posxpadre);

        if (strcmp(ordenhijo, "arriba")==0){

             if (posy>1){

               while (argument > 0){

                   if (posy>0){

                   posy--;
                   argument--;
                       }

                   else{

                   argument=0;
                   }
               }
                   }
             }

         if (strcmp(ordenhijo, "abajo")==0){

                   if (posy<100){

               while (argument > 0){

                    if (posy<100){
                    posy++;
                    argument--;

                     }

                     else{

                     argument=0;
                     }
                 }
                    }
             }

         if (strcmp(ordenhijo, "derecha")==0){

                    if (posx<100){

                  while (argument > 0){

                   if (posx<100){
                       posx++;
                       argument--;

                       }

                   else{
                        argument=0;
                   }
                 }
                }
             }

         if (strcmp(ordenhijo, "izquierda")==0){

                 if (posx>0){

                  while (argument > 0){

                    if (posx>0){
                       posx--;
                       argument--;
                        }

                    else{

                       argument=0;
                    }
                      }
                 }
             }



         printf("Robot desplazado hasta la posicion: (%d, %d)\n", posx, posy);



         sprintf(mensaje1, "%d", posx);   
         sprintf(mensaje2, "%d", posy);
         sprintf(mensaje3, "%d", getpid());      

         write(pipe2[1], mensaje1, 4);
             write(pipe2[1], mensaje3, 6);
         write(pipe2[1], mensaje2, 4);

         }

    }

    }
  } 
}

 close(pipe1[0]);
 close(pipe1[1]);
 close(pipe2[0]);
 close(pipe2[1]);

 }

 }

有谁知道为什么会这样?我在谷歌做了很多研究,但我尝试的每一个可能的答案都没有奏效。任何帮助都会非常有帮助。

谢谢你们!!

4

2 回答 2

2

您在非常小的缓冲区中执行大量 I/O。如果其中任何一个溢出,它们很可能会破坏堆栈。

如果可能的话,你应该在 Valgrind 中运行你的程序。您还可以尝试增加缓冲区的大小,并从fscanf()更安全的方式切换(例如读取一整行fgets()然后在内存中解析它)。

于 2012-04-27T12:56:53.660 回答
0
 read(pipe2[0], hijoPID, 6);

应该

 read(pipe2[0], hijoPID, 4);

但这不是唯一的问题。你应该为你的宽度使用常量,这样就不会发生这种情况。

const int hijoPID_l = 4;
read(pipe2[0], hijoPID, hijoPID_l);

此外,当您执行 fscanf 时,您应该指定宽度。

k=fscanf(fichero, "%7", id);
i=fscanf(fichero, "%10", orden);
j=fscanf(fichero, "%3", arg);

如果您使用常量作为长度,例如,

char fmt_id[8];
sprintf(fmt_id, "%%%d", id_l);
k=fscanf(fichero, fmt_id, id);

可用于在循环开始时动态创建格式字符串,然后为每个fscanf().

于 2019-03-22T19:51:51.407 回答