/*
ESTADOS
1.- (E)jecución
2.- (L)isto
3.- (B)loqueado
MANEJADOR ==> TRANSICIONES ENTRE ESTADOS
1.- El proceso se bloquea para recibir entrada
2.- El planificador selecciona OTRO proceso
3.- El planificador selecciona ESTE proceso
4.- La entrada ya está disponible
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define Clear() printf("\e[1;1H\e[2J");
void Ventana(void);
char *Comando(void);
pid_t Run(char*);
long Memoria( pid_t );
void CreaProceso(int , char *, pid_t, pid_t , char, long, char *);
void Completa_PROC(char *);
struct Procesos
{
char NOMBRE[20];
pid_t PID;
pid_t PPID;
char ESTADO;
long MEM_INI;
char SALIDA[20];
};
struct Procesos FORK[10]; // tabla de procesos
int Estado[10];
int N_Proc = 0, PPID_1=0;
char *NewComand;
long Memoria( pid_t PID )
{
char Archivo_stat[128];
FILE *FD;
char state, name[32];
int pid, ppid, pgrp, session, tty, tpgid, nlwp;
unsigned long flags, min_flt, cmin_flt, maj_flt, cmaj_flt, vsize, rsslim;
unsigned long long utime, stime, cutime, cstime, start_time;
long priority, nice, alarm, rss, startcode;
sprintf(Archivo_stat, "/proc/%i/stat", PID);
FD = fopen(Archivo_stat, "r");
if (FD == NULL) return perror("No puedo encontrar el proceso especificado"),1;
fscanf(FD, "%d %s " "%c " "%d %d %d %d %d " "%lu %lu %lu %lu %lu " "%Lu %Lu %Lu %Lu " "%ld %ld " "%d "
"%ld " "%Lu " "%lu " "%ld" "%lu" "%ld",
&pid, name, &state, &ppid, &pgrp, &session, &tty, &tpgid, &flags, &min_flt, &cmin_flt, &maj_flt, &cmaj_flt,
&utime, &stime, &cutime, &cstime, &priority, &nice, &nlwp, &alarm, &start_time, &vsize, &rss, &rsslim, &startcode);
fclose(FD);
return startcode;
}
pid_t Run(char *NewComand)
{
strcpy(FORK[N_Proc].NOMBRE, NewComand);
FORK[N_Proc].PID = fork(); FORK[N_Proc].PID = getpid();
FORK[N_Proc].PPID = getppid();
if ( !PPID_1 ) PPID_1 = FORK[N_Proc].PPID;
else FORK[N_Proc].PPID = PPID_1;
FORK[N_Proc].ESTADO = 'B';
FORK[N_Proc].MEM_INI = Memoria( FORK[N_Proc].PID );
strcpy(FORK[N_Proc].SALIDA, "----------");
N_Proc++;
return FORK[N_Proc-1].PID;
}
void Ventana()
{
int k = 0;
printf("==============================================================================================\n");
printf("Nombre\t\tPID\t\tPPID\tESTADO\t\tINICIO DE MEMORIA\tSALIDA\n");
printf("==============================================================================================\n");
for(k = 0; k < N_Proc; k++)
{
printf("%s\t\t%i\t\t%i\t%c\t\t%ld\t\t%s\n", FORK[k].NOMBRE, FORK[k].PID, FORK[k].PPID,
FORK[k].ESTADO, FORK[k].MEM_INI, FORK[k].SALIDA);
}
printf("==============================================================================================\n\n");
}
char *Comando( )
{
char *NewComand=(char*)malloc(sizeof(char)*20);
printf("Comando: ");
scanf("%s", NewComand);
return NewComand;
}
void CreaProceso(int PROC, char *NOM, pid_t PID, pid_t PPID, char EDO, long MEM, char *SAL)
{
strcpy(FORK[PROC].NOMBRE, NOM);
FORK[PROC].PID = PID;
FORK[PROC].PPID = PPID;
FORK[PROC].ESTADO = EDO;
FORK[PROC].MEM_INI = MEM;
strcpy(FORK[PROC].SALIDA, SAL);
}
void Completa_PROC(char *COM)
{
}
int main(int N, char **A)
{
char *NewComand=(char*)malloc(sizeof(char)*20);
if ( (FORK[0].PID = fork()) == 0 ) CreaProceso(0, "NOMBRE", getpid(), getppid(), 'B', 0, "SALIDA"); //1
else
if ( (FORK[1].PID = fork()) == 0 ) CreaProceso(1, "NOMBRE", getpid(), getppid(), 'B', 0, "SALIDA"); //2
else
if ( (FORK[2].PID = fork()) == 0 ) CreaProceso(2, "NOMBRE", getpid(), getppid(), 'B', 0, "SALIDA"); //3
else
if ( (FORK[3].PID = fork()) == 0 ) CreaProceso(3, "NOMBRE", getpid(), getppid(), 'B', 0, "SALIDA"); //4
else
if ( (FORK[4].PID = fork()) == 0 ) CreaProceso(4, "NOMBRE", getpid(), getppid(), 'B', 0, "SALIDA"); //5
else //PADRE
{
waitpid(FORK[0].PID, &Estado[0], 0);
waitpid(FORK[1].PID, &Estado[1], 0);
waitpid(FORK[2].PID, &Estado[2], 0);
waitpid(FORK[3].PID, &Estado[3], 0);
waitpid(FORK[4].PID, &Estado[4], 0);
while ( 1 )
{
getpid(), getppid();
Clear(); Ventana(); Completa_PROC(Comando());
}
}
}