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