Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - agrey

#1
Programación C/C++ / [AYUDA] Con lista en C
12 Diciembre 2012, 02:06 AM
/*

El problema es que al ejecutar el comando splano ps deberia de insertar en la lista la informacion del proceso ps, pero al ejecutar el comando imprimir la lista esta vacia. Un saludo GRACIAS

*/


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <sys/resource.h>
#include <sys/wait.h>

struct proceso
{
   int pid;
   int prioridad;
   char *comando;
   char *fecha;
   char *status;
   
   struct proceso *sig;//apuntador a la siguiente estructura
};

typedef struct proceso _nodo;

_nodo *crearLista(_nodo *apuntador)
{
   apuntador = NULL;
   return apuntador;
}

_nodo *insertarEnLista(int pid,int prioridad,char *comando,char *fecha,char *status,_nodo *apuntador)
{
   _nodo *registroNuevo, *apuntadorAuxiliar;

   registroNuevo = (_nodo*) malloc(sizeof(_nodo));

   if(registroNuevo != NULL)
   {
      registroNuevo->pid = pid;
      registroNuevo->prioridad = prioridad;
      registroNuevo->comando = comando;
      registroNuevo->fecha = fecha;
      registroNuevo->status = status;

      if(apuntador == NULL)
         apuntador = registroNuevo;
      else
      {
         apuntadorAuxiliar = apuntador;

         while(apuntadorAuxiliar->sig != NULL)
            apuntadorAuxiliar = apuntadorAuxiliar->sig;
            
         apuntadorAuxiliar->sig = registroNuevo;
      }
   }
   
   return apuntador;

}

void imprimirLista(_nodo *apuntador)
{
   _nodo *apuntadorAuxiliar;

   apuntadorAuxiliar = apuntador;
   
   while(apuntadorAuxiliar != NULL)
   {
      printf("%d -> ",apuntadorAuxiliar->pid);
      printf("%d -> ",apuntadorAuxiliar->prioridad);
      printf("%s -> ",apuntadorAuxiliar->comando);
      printf("%s -> ",apuntadorAuxiliar->fecha);
      printf("%s -> ",apuntadorAuxiliar->status);
      apuntadorAuxiliar = apuntadorAuxiliar->sig;
   }
   
   printf("NULL \n");
   
   return;
}

int main()
{
   _nodo *inicioLista;
   
    inicioLista= crearLista(inicioLista);
   
    //inicioLista = insertarEnLista(5,12,"pwd","19/05","ACT",inicioLista);

   
int stop=1,n;

char *comando[1000],*p;
char *cadena = (char *)malloc(sizeof(char)*1000);


   while(1){
      printf("Introduzca el comando: ");
      p = fgets(cadena, 1000, stdin);
         if (strcmp(p,"\n")==0) {//si p nulo, salta error y sale del programa
         continue;
         
      }
       n = TrocearCadena(p,comando);
      
      if (0!=ProcesarComando(comando,&n, inicioLista)) break;
   
   }

   free(inicioLista);
   free(cadena);
   
   return EXIT_SUCCESS;
}

int TrocearCadena(char *p, char *trozos[1000]){
   int i=1;
   if ((trozos[0]=strtok(p," \n\t"))==NULL)
   return 0;
   while ((trozos=strtok(NULL," \n\t"))!=NULL)//busca los delimitadores y
   i++;
   return i;
}

int ProcesarComando(char *coman[],int *n,_nodo *listaProcesos){
   
   if(strcmp(coman[0],"splano")==0){splano(coman,listaProcesos,n);}
   else if(strcmp(coman[0],"imprimir")==0){imprimirLista(listaProcesos);}
         
   return 0;
   
}

int splano(char *cadena[],_nodo *listaProcesos,int *n){
   _nodo *iniciolista;
   long tiempo= time(NULL);
   char * fecha = ctime(&tiempo);
   int which = PRIO_PROCESS;
   char *aux;
   int pid_hijo;
   int *espera = NULL;
   int i=0;
   int err=0;
   pid_hijo = fork();
      if(pid_hijo ==0){
              if(cadena[*n-1][0]=='@'){
         aux = cadena[*n-1];
         aux[0]=' ';
         if(setpriority(which,execvp(cadena[1],&cadena[1]),atoi(aux))<0){
               perror ("setprio");
               }
         }else{
         
         if(execvp(cadena[1],&cadena[1])==-1){perror("splano-EXEC");}
         

         }

      }else if(pid_hijo ==-1)perror("splano-fork");
         
               
         

   iniciolista = insertarEnLista(pid_hijo,getpriority(which,0),cadena[1],"act",fecha,listaProcesos);
   
   
}