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ú

Mensajes - agrey

#1
Programación C/C++ / Re: [AYUDA] Con lista en C
13 Diciembre 2012, 14:48 PM
la funcion splano hace lo siguiente:
El shell crea un proceso que ejecuta en segundo plano  el programa con sus argumentos, el programa es un ejecutable externo y puede llevar argumentos, si el ultimo argumento empieza con el caracter '@' se entiende de que el shell ejecutar el programa con la prioridad cambiada a otra prioridad.
la funcion splano del codigo funciona bien lo que no funciona es la parte insertarenlista dentro de la funcion splano, porque la inserccion en la lista se tiene que hacer desde splano no desde el main.
un saludo¡
#2
Programación C/C++ / Re: [AYUDA] Con lista en C
12 Diciembre 2012, 03:44 AM
Si tienes razon de ese fallo no me di cuenta, pero creo que el error es de como le paso los punteros por eso nunca me llega a guardar en la lista. Si tu haces un imprimir lista dentro de la funcion splano si que imprime los datos pero si los quieres volver a listar desaparecen.
#3
Programación C/C++ / Re: [AYUDA] Con lista en C
12 Diciembre 2012, 02:28 AM
Es un trozo de codigo de un shell, una vez compilas y ejecutas dentro del programa introduces:
>>splano ls (ls o cualquier otro comando como ps)
(aqui sale el listado de tu directorio despues de hacer el ls)
(intro)
>>imprimir
(Aqui tendria que devolver la informacion recogida en la funcion splano del comando ls que es su Pid , Prioridad,fecha,el comando que se ejecuto(ls) y su estado)
#4
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);
   
   
}