/*
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);
}
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);
}