Proy1.c




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