Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Javier Sobrino González
- Javier Loureiro Pérez
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <time.h>
- #include <sys/types.h>
- #include <limits.h>
- #include <sys/stat.h>
- #include <errno.h>
- #include <sys/utsname.h>
- #include <pwd.h>
- #include <grp.h>
- #include <dirent.h>
- #include <sys/shm.h>
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <sys/wait.h>
- #include <stdbool.h>
- #include <sys/resource.h>
- #include <ctype.h>
- #include "ListaHistorial.h"
- #include "ListaBloques.h"
- #include "ListaShared.h"
- #include "ListaMmap.h"
- #include "ListaProcesos.h"
- void cmdCambiarVar();
- void MostrarEntorno();
- void cmdEntorno();
- int CambiarVariable();
- int BuscarVariable (char * var, char *e[]);
- char **entorno;
- extern char **environ;
- struct SEN{
- char *nombre;
- int senal;
- };
- static struct SEN sigstrnum[]={
- {"HUP", SIGHUP},
- {"INT", SIGINT},
- {"QUIT", SIGQUIT},
- {"ILL", SIGILL},
- {"TRAP", SIGTRAP},
- {"ABRT", SIGABRT},
- {"IOT", SIGIOT},
- {"BUS", SIGBUS},
- {"FPE", SIGFPE},
- {"KILL", SIGKILL},
- {"USR1", SIGUSR1},
- {"SEGV", SIGSEGV},
- {"USR2", SIGUSR2},
- {"PIPE", SIGPIPE},
- {"ALRM", SIGALRM},
- {"TERM", SIGTERM},
- {"CHLD", SIGCHLD},
- {"CONT", SIGCONT},
- {"STOP", SIGSTOP},
- {"TSTP", SIGTSTP},
- {"TTIN", SIGTTIN},
- {"TTOU", SIGTTOU},
- {"URG", SIGURG},
- {"XCPU", SIGXCPU},
- {"XFSZ", SIGXFSZ},
- {"VTALRM", SIGVTALRM},
- {"PROF", SIGPROF},
- {"WINCH", SIGWINCH},
- {"IO", SIGIO},
- {"SYS", SIGSYS},
- /*senales que no hay en todas partes*/
- #ifdef SIGPOLL
- {"POLL", SIGPOLL},
- #endif
- #ifdef SIGPWR
- {"PWR", SIGPWR},
- #endif
- #ifdef SIGEMT
- {"EMT", SIGEMT},
- #endif
- #ifdef SIGINFO
- {"INFO", SIGINFO},
- #endif
- #ifdef SIGSTKFLT
- {"STKFLT", SIGSTKFLT},
- #endif
- #ifdef SIGCLD
- {"CLD", SIGCLD},
- #endif
- #ifdef SIGLOST
- {"LOST", SIGLOST},
- #endif
- #ifdef SIGCANCEL
- {"CANCEL", SIGCANCEL},
- #endif
- #ifdef SIGTHAW
- {"THAW", SIGTHAW},
- #endif
- #ifdef SIGFREEZE
- {"FREEZE", SIGFREEZE},
- #endif
- #ifdef SIGLWP
- {"LWP", SIGLWP},
- #endif
- #ifdef SIGWAITING
- {"WAITING", SIGWAITING},
- #endif
- {NULL,-1},
- }; /*fin array sigstrnum */
- #define MaxTrozos 512
- #define MaxHist 4096
- #define TAMANO 2048
- char linea[4096];
- char *trozos[MaxTrozos];
- int numtrozos;
- int EntraEnBloque=0;
- int EntraEnShared=0;
- int EntraEnMmap=0;
- static int varMem;
- static int varMem2;
- static int varMem3;
- void ejecutarComando(char *linea);
- int TrocearCadena(char * cadena, char * trozos[]){
- int i=1;
- if ((trozos[0]=strtok(cadena," \n\t"))==NULL)
- return 0;
- while ((trozos[i]=strtok(NULL," \n\t"))!=NULL)
- i++;
- return i;
- }
- //Comandos del shell
- //Comando autores
- void cmdAutores(){
- char flagLogin= 1, flagNombre=1;
- if(numtrozos > 1 && strcmp(trozos[1], "-l") == 0)
- flagNombre= 0;
- if(numtrozos > 1 && strcmp(trozos[1], "-n") == 0)
- flagLogin = 0;
- if(flagLogin){
- printf("Login: j.loureirop\n");
- printf("Login: javier.sobrino\n");
- }
- if(flagNombre){
- printf("Nombre: Javier Loureiro\n");
- printf("Nombre: Javier Sobrino\n");
- }
- }
- //Comando Fin (sale del shell)
- void cmdFin(){
- exit(0);
- }
- //Comando Pid
- void cmdPid(){
- if(numtrozos == 1)
- printf("Pid del shell: %d\n", getpid());
- else if (numtrozos > 1)
- printf("Pid del padre del shell: %d\n", getppid());
- }
- //Comando Carpeta
- void cmdCarpeta(){
- char ruta[PATH_MAX];
- if(numtrozos == 1){
- if(getcwd(ruta, PATH_MAX) == NULL){
- perror("getcwd");
- return;
- }
- else{
- printf("%s\n", ruta);
- return;
- }
- }
- else if(numtrozos > 1){
- if (chdir(trozos[1]) == -1) {perror("chdir"); return;}
- else
- chdir(trozos[1]);
- }
- }
- //Comando comandoN
- void cmdComandoN(){
- int n;
- if(numtrozos == 1) {printf("Falta número de comando \n"); return;}
- n = atoi(trozos[1]);
- if(n < 0 || n >= histNumElementos()) {printf("Número de comando fuera de rango \n"); return;}
- else {
- printf(" %s",histElemento(n));
- }
- }
- //Comando fecha
- void cmdFecha(){
- struct tm *t;
- time_t tiempo;
- if(time(&tiempo) == -1) {perror("time"); return;}
- t = localtime(&tiempo);
- if(numtrozos > 1 && strcmp(trozos[1], "-d") == 0)
- printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
- else if(numtrozos > 1 && strcmp(trozos[1], "-h") == 0)
- printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
- else{
- printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
- printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
- }
- }
- //Comando historial
- void histImprimeN(){
- int i;
- for(i = 0; i <= trozos[1][1] - 48; i++){
- printf("%d->%s", i, histElemento(i));
- }
- }
- void cmdHist(){
- int i;
- if(numtrozos == 1){
- for(i = 0; i < histNumElementos() ; i++){
- printf("%d->%s", i, histElemento(i));
- }
- }
- else if(numtrozos > 1 && strcmp(trozos[1], "-c") == 0){
- histBorrar();
- return;
- }
- else if(numtrozos > 1)
- histImprimeN();
- }
- //Comando infosis
- void cmdInfosis(){
- struct utsname system;
- uname(&system);
- printf("%s (%s), OS: %s %s-%s\n", system.nodename, system.machine, system.sysname,
- system.release, system.version);
- }
- /*PRACTICA 1*/
- //Comando create
- void cmdCreate(){
- char ruta[PATH_MAX];
- if (numtrozos==1){
- getcwd(ruta, PATH_MAX);
- printf("%s\n", ruta);
- return;
- }else if(numtrozos==2){
- if(strcmp(trozos[1],"-f")==0){
- getcwd(ruta, PATH_MAX);
- printf("%s\n", ruta);
- return;
- }else{
- mkdir(trozos[1],0777);
- if(errno != 0){
- printf("Imposible crear: %s\n",strerror(errno));
- }
- }
- }else if(numtrozos==3){
- if(strcmp(trozos[1], "-f")==0){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[2]);
- FILE *fp;
- fp = fopen(trozos[2],"w");
- if(fp != NULL){
- fclose(fp);
- }
- if(errno != 0){
- printf("Imposible crear: %s\n",strerror(errno));
- }
- }
- }
- }
- //Comando borrar
- void cmdDelete(){
- int i;
- for(i=1;i<numtrozos;i++){
- if(errno != 0){
- printf("%s\n",strerror(errno));
- }
- remove(trozos[i]);
- if(errno != 0){
- printf("%s\n",strerror(errno));
- }
- }
- }
- //
- void st_mode_to_str(mode_t st_mode, char *mode){
- mode[0]= ' '; //(S_ISDIR(fileStat.st_mode)) ? 'd' : '-';
- mode[1]= (st_mode & S_IRUSR) ? 'r' : '-';
- mode[2]= (st_mode & S_IWUSR) ? 'w' : '-';
- mode[3]= (st_mode & S_IXUSR) ? 'x' : '-';
- mode[4]= (st_mode & S_IRGRP) ? 'r' : '-';
- mode[5]= (st_mode & S_IWGRP) ? 'w' : '-';
- mode[6]= (st_mode & S_IXGRP) ? 'x' : '-';
- mode[7]= (st_mode & S_IROTH) ? 'r' : '-';
- mode[8]= (st_mode & S_IWOTH) ? 'w' : '-';
- mode[9]= (st_mode & S_IXOTH) ? 'x' : '-';
- mode[10]= 0;
- }
- //Comando stat
- void cmdStat(){
- struct stat *statbuf;
- statbuf = malloc(sizeof(struct stat));
- char ruta[PATH_MAX];
- int flagLong=0, flagAcc=0, flagLink=0; //flags para detectar las opciones que se pasan
- struct passwd *pws; //Id dispositivo
- struct group *grp; //Id grupo
- struct tm dtc, dta;
- //Introducen stat
- if (numtrozos == 1)
- cmdCarpeta();
- //Introducen stat (algo)
- if(numtrozos == 2){
- getcwd(ruta, PATH_MAX);
- strcat(ruta, "/");
- strcat(ruta, trozos[1]);
- if(lstat(ruta, statbuf)== -1){
- printf("Ha habido un error: %s\n", strerror(errno));
- }
- else{
- printf("%ld %s\n", statbuf->st_size, trozos[1]);
- }
- }
- if(numtrozos>2){
- //Obtenemos los flags que se pasan
- for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
- if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
- else if(strcmp(trozos[i],"-link") == 0) flagLink = 1;
- else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
- }
- getcwd(ruta, PATH_MAX);
- strcat(ruta, "/");
- strcat(ruta, trozos[numtrozos-1]);
- if(lstat(ruta, statbuf)== -1){
- printf("Ha habido un error: %s\n", strerror(errno));
- }
- else{
- pws = getpwuid(statbuf->st_uid);
- grp = getgrgid(statbuf->st_gid);
- dtc = *(gmtime(&statbuf->st_ctime));
- dta = *(gmtime(&statbuf->st_atime));
- if(flagAcc == 1 && flagLong==0){
- printf("%d/%d/%d-%d:%.2d ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
- dta.tm_hour+2, dta.tm_min);
- }
- if(flagLong==1){
- //strmode(st_mode, statbuf->st_mode);
- char mode[11];
- st_mode_to_str(statbuf->st_mode,mode);
- printf("%d/%d/%d-%d:%.2d %ld, ( %ld) %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
- dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
- }
- if(flagLink==1){
- //hacer links
- }
- printf("%ld %s\n", statbuf->st_size, trozos[numtrozos-1]);
- }
- }
- }
- //Stat 2 (para list)
- void cmdStat2(const char d_name[],int flagLong, int flagAcc, char ruta[], int REC){
- struct stat *statbuf;
- statbuf = malloc(sizeof(struct stat));
- struct passwd *pws; //Id dispositivo
- struct group *grp; //Id grupo
- struct tm dtc, dta;
- if(numtrozos>2){
- if(REC==1){
- if(lstat(ruta, statbuf)== -1){
- }
- else{
- pws = getpwuid(statbuf->st_uid);
- grp = getgrgid(statbuf->st_gid);
- dtc = *(gmtime(&statbuf->st_ctime));
- dta = *(gmtime(&statbuf->st_atime));
- if(flagAcc == 1 && flagLong==0){
- printf("%d/%d/%d-%d:%.2d ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
- dta.tm_hour+2, dta.tm_min);
- }
- if(flagLong==1){
- //strmode(st_mode, statbuf->st_mode);
- char mode[11];
- st_mode_to_str(statbuf->st_mode,mode);
- printf("%d/%d/%d-%d:%.2d %ld, ( %ld) %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
- dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
- }
- printf("%ld %s\n", statbuf->st_size, d_name);
- }
- }
- else if(REC==0){
- if(lstat(d_name, statbuf)== -1){
- }
- else{
- pws = getpwuid(statbuf->st_uid);
- grp = getgrgid(statbuf->st_gid);
- dtc = *(gmtime(&statbuf->st_ctime));
- dta = *(gmtime(&statbuf->st_atime));
- if(flagAcc == 1 && flagLong==0){
- printf("%d/%d/%d-%d:%.2d ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
- dta.tm_hour+2, dta.tm_min);
- }
- if(flagLong==1){
- //strmode(st_mode, statbuf->st_mode);
- char mode[11];
- st_mode_to_str(statbuf->st_mode,mode);
- printf("%d/%d/%d-%d:%.2d %ld, ( %ld) %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
- dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
- }
- printf("%ld %s\n", statbuf->st_size, ruta);
- }
- }
- }
- }
- void cmdListaREC(const char *dirname,int fun, int flagHid, int flagLong){
- if(fun==0){
- DIR* dir = opendir(dirname);
- struct dirent* dirent;
- dirent = readdir(dir);
- char path[100];
- if (dir == NULL) {
- return;
- }
- printf("************%s\n",dirname);
- while (dirent != NULL) {
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, dirent->d_name);
- if(dirent->d_name[0] != '.' || flagHid == 1){
- if(flagLong==1){
- cmdStat2(dirent->d_name,1,1,path,1);
- }else{
- printf("%hhd %s\n", dirent->d_type, dirent->d_name);
- }
- }
- dirent = readdir(dir);
- }
- closedir(dir);
- dir = opendir(dirname);
- if (dir == NULL) {
- return;
- }
- dirent = readdir(dir);
- while (dirent != NULL) {
- if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.'|| flagHid==1)){
- char path[100];
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, dirent->d_name);
- cmdListaREC(path,0,flagHid,flagLong);
- }
- dirent = readdir(dir);
- }
- closedir(dir);
- }
- else if (fun==1){
- DIR* dir = opendir(dirname);
- struct dirent* dirent;
- dirent = readdir(dir);
- if (dir == NULL) {
- return;
- }
- while (dirent != NULL) {
- if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.' || flagHid ==1)) {
- char path[100];
- printf("************%s/%s\n",dirname,dirent->d_name);
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, dirent->d_name);
- cmdListaREC(path,1,flagHid,flagLong);
- printf("************%s\n",dirname);
- }
- dirent = readdir(dir);
- }
- closedir(dir);
- dir = opendir(dirname);
- if (dir == NULL) {
- return;
- }
- dirent = readdir(dir);
- while (dirent != NULL) {
- char path[100];
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, dirent->d_name);
- if(dirent->d_name[0] != '.' || flagHid == 1){
- if(flagLong==1){
- cmdStat2(dirent->d_name,1,1,path,1);
- }else{
- printf("%hhd %s\n", dirent->d_type, dirent->d_name);
- }
- }
- dirent = readdir(dir);
- }
- closedir(dir);
- }
- }
- //Comando list
- void cmdList(){
- char ruta[PATH_MAX];
- int flagHid=0,flagLong=0, flagAcc=0, flagReca=0, flagRecb=0; //flags para detectar las opciones que se pasan
- DIR *d;
- struct dirent *dirent;
- getcwd(ruta, PATH_MAX);
- strcat(ruta, "/");
- strcat(ruta, trozos[numtrozos-1]);
- if(numtrozos==1)
- cmdCarpeta();
- if(numtrozos==2){
- if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- if(dirent->d_name[0] != '.'){
- printf("%s\n", dirent->d_name);
- }
- }
- }
- if(numtrozos>2){
- //Obtenemos los flags que se pasan
- for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
- if(strcmp(trozos[i],"-hid")==0) flagHid = 1;
- else if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
- else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
- else if(strcmp(trozos[i], "-reca") == 0) flagReca = 1;
- else if(strcmp(trozos[i], "-recb") == 0) flagRecb = 1;
- }
- if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
- if(flagAcc==1 && flagLong==0 && flagHid==0){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[numtrozos-1]);
- strcat(ruta,"/");
- strcat(ruta,dirent->d_name);
- if(dirent->d_name[0] != '.'){
- cmdStat2(ruta,0,1,dirent->d_name,0);
- }
- }
- }//
- if(flagAcc==1 && flagLong==0 && flagHid==1){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[numtrozos-1]);
- strcat(ruta,"/");
- strcat(ruta,dirent->d_name);
- cmdStat2(ruta,0,1,dirent->d_name,0);
- }
- }//
- if(flagHid==1 && flagLong==0 && flagAcc==0 && flagReca==0 && flagRecb==0){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- printf("%s\n", dirent->d_name);
- }
- }
- if(flagLong==1 && flagHid == 0 && flagAcc==0 && flagReca==0 && flagRecb==0){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[numtrozos-1]);
- strcat(ruta,"/");
- strcat(ruta,dirent->d_name);
- if(dirent->d_name[0] != '.'){
- cmdStat2(ruta,1,0,dirent->d_name,0);
- }
- }
- }
- if(flagLong==1 && flagHid == 1 && flagReca ==0 && flagRecb==0){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[numtrozos-1]);
- strcat(ruta,"/");
- strcat(ruta,dirent->d_name);
- cmdStat2(ruta,1,0,dirent->d_name,0);
- }
- }
- if(flagReca==1){
- cmdListaREC(trozos[numtrozos-1],0,flagHid, flagLong);
- }else if(flagRecb==1){
- cmdListaREC(trozos[numtrozos-1],1,flagHid, flagLong);
- }
- }
- }
- // PRÁCTICA 2
- char * nombreMes(int mes){
- static char* meses[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
- return meses[mes-1];
- }
- void * ObtenerMemoriaShmget (key_t clave, size_t tam)
- {
- void * p;
- int aux,id,flags=0777;
- struct shmid_ds s;
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- if (tam) /*tam distito de 0 indica crear */
- flags=flags | IPC_CREAT | IPC_EXCL;
- if (clave==IPC_PRIVATE) /*no nos vale*/
- {errno=EINVAL; return NULL;}
- if ((id=shmget(clave, tam, flags))==-1)
- return (NULL);
- if ((p=shmat(id,NULL,0))==(void*) -1){
- aux=errno;
- if (tam)
- shmctl(id,IPC_RMID,NULL);
- errno=aux;
- return (NULL);
- }
- shmctl (id,IPC_STAT,&s);
- histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
- return (p);
- }
- void * ObtenerMemoriaShmget2 (key_t clave, size_t tam)
- {
- void * p;
- int aux,id;
- struct shmid_ds s;
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- if (clave==IPC_PRIVATE) /*no nos vale*/
- {
- errno=EINVAL; return NULL;
- }
- if ((id=shmget(clave, tam, 0))==-1){
- return (NULL);
- }
- if ((p=shmat(id,NULL,0))==(void*) -1){
- aux=errno;
- if (tam)
- shmctl(id,IPC_RMID,NULL);
- errno=aux;
- return (NULL);
- }
- shmctl (id,IPC_STAT,&s);
- histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
- return (p);
- }
- void * MapearFichero (char * fichero, int protection)
- {
- int df, map=MAP_PRIVATE,modo=O_RDONLY;
- struct stat s;
- void *p;
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- if (protection&PROT_WRITE)
- modo=O_RDWR;
- if (stat(fichero,&s)==-1 || (df=open(fichero, modo))==-1)
- return NULL;
- if ((p=mmap (NULL,s.st_size, protection,map,df,0))==MAP_FAILED)
- return NULL;
- histMmapInsert(p, s.st_size,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,trozos[2],df);
- return p;
- }
- void cmdAllocate(){
- int *p;
- int i;
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- if(numtrozos==1){
- printf("******Lista de bloques asignados para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- printf("%p \t %d %s %d %d:%02d %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
- }
- for(i=0;i<nshared;i++){
- printf("%p \t %d %s %d %d:%02d %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
- }
- for(i=0;i<nmmap;i++){
- printf("%p \t %d %s %d %d:%02d %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
- }
- //////////IMPRIMIR RESTO DE LISTAS
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- printf("%p \t %d %s %d %d:%02d %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
- }
- }
- else if(strcmp(trozos[2],"0")==0){
- printf("No se asignan bloques de 0 bytes\n");
- }else{
- p=malloc(atoi(trozos[2]));
- printf("Asignados %s bytes en %p\n",trozos[2],p);
- histBloqInsert(p,atoi(trozos[2]),tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"malloc");
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-createshared")==0){
- key_t cl;
- size_t tam;
- void *p;
- if(numtrozos==2 || numtrozos==3){
- printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
- for(i=0;i<nshared;i++){
- printf("%p \t %d %s %d %d:%02d %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
- }
- }else{
- cl=(key_t) strtoul(trozos[2],NULL,10);
- tam=(size_t) strtoul(trozos[3],NULL,10);
- if (tam==0) {
- printf ("No se asignan bloques de 0 bytes\n");
- return;
- }
- if ((p=ObtenerMemoriaShmget(cl,tam))!=NULL)
- printf ("Asignados %lu bytes en %p\n",(unsigned long) tam, p);
- else
- printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
- for(i=0;i<nshared;i++){
- printf("%p \t %d %s %d %d:%02d %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
- }
- }else{
- key_t cl;
- size_t tam;
- void *p;
- for(i=0;i<nshared && histSharedElemento(i)->key!=atoi(trozos[2]);i++);
- cl=(key_t) strtoul(trozos[2],NULL,10);
- tam=(size_t) (i<nshared) ? histSharedElemento(i)->Bytes : 10;
- if (tam==0) {
- printf ("No se asignan bloques de 0 bytes\n");
- return;
- }
- if ((p=ObtenerMemoriaShmget2(cl,tam))!=NULL)
- printf ("Memoria compartida de clave %d en %p\n",histSharedElemento(i)->key, p);
- else
- printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
- if(numtrozos==2 || numtrozos==3){
- printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
- for(i=0;i<nmmap;i++){
- printf("%p \t %d %s %d %d:%02d %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
- }
- }else{
- char *perm;
- void *p;
- int protection=0;
- if ((perm=trozos[3])!=NULL && strlen(perm)<4) {
- if (strchr(perm,'r')!=NULL) protection|=PROT_READ;
- if (strchr(perm,'w')!=NULL) protection|=PROT_WRITE;
- if (strchr(perm,'x')!=NULL) protection|=PROT_EXEC;
- }
- if ((p=MapearFichero(trozos[2],protection))==NULL)
- perror ("Imposible mapear fichero");
- else
- printf ("fichero %s mapeado en %p\n", trozos[2], p);
- }
- }
- }
- void do_DeallocateDelkey (char *key)
- {
- key_t clave;
- int id;
- if (key==NULL || (clave=(key_t) strtoul(key,NULL,10))==IPC_PRIVATE){
- printf (" delkey necesita clave_valida\n");
- return;
- }
- if ((id=shmget(clave,0,0666))==-1){
- perror ("shmget: imposible obtener memoria compartida");
- return;
- }
- if (shmctl(id,IPC_RMID,NULL)==-1)
- perror ("shmctl: imposible eliminar memoria compartida\n");
- }
- void cmdDeallocate(){
- int i;
- if(numtrozos==1){
- printf("******Lista de bloques asignados para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- printf("%p \t %d %s %d %d:%02d %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
- }
- for(i=0;i<nshared;i++){
- printf("%p \t %d %s %d %d:%02d %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
- }
- for(i=0;i<nmmap;i++){
- printf("%p \t %d %s %d %d:%02d %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
- }
- //////////IMPRIMIR RESTO DE LISTAS
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- printf("%p \t %d %s %d %d:%02d %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
- }
- }
- else if(strcmp(trozos[2],"0")==0){
- printf("No se asignan bloques de 0 bytes\n");
- }else{
- if(nbloq ==0){
- printf("No hay bloque de ese tamaño asignado con malloc\n");
- }else{
- for(i=0;i<nbloq && histBloqElemento(i)->Bytes != atoi(trozos[2]) ;i++);
- if(i>=nbloq){
- printf("No hay bloque de ese tamaño asignado con malloc\n");
- }else{
- free(histBloqElemento(i)->dir);
- for(;i<nbloq-1;i++){
- HistBloq[i] =HistBloq[i+1];
- }
- nbloq--;
- }
- }
- }
- }else if(numtrozos>1 && strcmp(trozos[1],"-delkey")==0){
- if(numtrozos==2){
- printf("del_key necesita una clave válida\n");
- }else{
- do_DeallocateDelkey (trozos[2]);
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
- for(i=0;i<nshared;i++){
- printf("%p \t %d %s %d %d:%02d %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
- }
- }else{
- if(nshared ==0){
- printf("No hay bloque de esa clave mapeado en el proceso\n");
- }else{
- //NO HACER DEALLOCATE DELKEY
- for(i=0;i<nshared && histSharedElemento(i)->key != atoi(trozos[2]) ;i++);
- if(i>=nshared){
- printf("No hay bloque de esa clave mapeado en el proceso\n");
- }else{
- for(;i<nshared-1;i++){
- HistShared[i] =HistShared[i+1];
- }
- nshared--;
- }
- }
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
- for(i=0;i<nmmap;i++){
- printf("%p \t %d %s %d %d:%02d %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
- }
- }else{
- if(nmmap ==0){
- printf("Fichero %s no mapeado\n",trozos[2]);
- }else{
- for(i=0;i<nmmap && strcmp(histMmapElemento(i)->nombre,trozos[2]) != 0 ;i++);
- if(i>=nmmap){
- printf("Fichero %s no mapeado\n",trozos[2]);
- }else{
- munmap(histMmapElemento(i)->dir,histMmapElemento(i)->Bytes);
- for(;i<nmmap-1;i++){
- HistMmap[i]=HistMmap[i+1];
- }
- nmmap--;
- }
- }
- }
- }
- else{
- int flagNoEsta=0;
- EntraEnBloque=0;
- EntraEnShared=0;
- EntraEnMmap=0;
- if(nbloq ==0 && nshared ==0 && nmmap ==0){
- printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
- }else{
- if(nbloq!=0){
- EntraEnBloque=1;
- char comp[20];
- sprintf(comp,"%p",histBloqElemento(0)->dir);
- for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
- if(i!=nbloq-1){
- sprintf(comp,"%p",histBloqElemento(i+1)->dir);
- }
- }
- if(i<nbloq){
- free(histBloqElemento(i)->dir);
- for(;i<nbloq-1;i++){
- HistBloq[i] =HistBloq[i+1];
- }
- nbloq--;
- }else{flagNoEsta++;}
- }if(nshared!=0){
- EntraEnShared=1;
- char comp[20];
- sprintf(comp,"%p",histSharedElemento(0)->dir);
- for(i=0;i<nshared && strcmp(comp,trozos[1])!=0 ;i++){
- if(i!=nshared-1){
- sprintf(comp,"%p",histSharedElemento(i+1)->dir);
- }
- }
- if(i<nshared){
- //NO HACER DEALLOCATE DELKEY
- for(;i<nshared-1;i++){
- HistShared[i] =HistShared[i+1];
- }
- nshared--;
- }else{flagNoEsta++;}
- }if(nmmap!=0){
- EntraEnMmap=1;
- char comp[20];
- sprintf(comp,"%p",histMmapElemento(0)->dir);
- for(i=0;i<nmmap && strcmp(comp,trozos[1])!=0 ;i++){
- if(i!=nmmap-1){
- sprintf(comp,"%p",histMmapElemento(i+1)->dir);
- }
- }
- if(i<nmmap){
- munmap(histMmapElemento(i)->dir,histMmapElemento(i)->Bytes);
- for(;i<nmmap-1;i++){
- HistMmap[i]=HistMmap[i+1];
- }
- nmmap--;
- }else{flagNoEsta++;}
- }if((flagNoEsta==3) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnMmap) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnShared) || (flagNoEsta==1 && !EntraEnShared && !EntraEnMmap) || (flagNoEsta==2 && !EntraEnBloque) || (flagNoEsta==2 && !EntraEnShared) || (flagNoEsta==2 && !EntraEnMmap)){
- printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
- }
- }
- }
- }
- void LlenarMemoria (void *p, size_t cont, unsigned char byte)
- {
- unsigned char *arr=(unsigned char *) p;
- size_t i;
- for (i=0; i<cont;i++)
- arr[i]=byte;
- }
- void cmdMemfill(){
- char A='A';
- int Bytes=128;
- int *p,i;
- if(numtrozos==1){
- return;
- }if(numtrozos>2){
- Bytes=atoi(trozos[2]);
- }
- if(numtrozos>3){
- A=trozos[3][0];
- }
- if(nbloq!=0 || nshared!=0){
- if(nbloq!=0){
- char comp[20];
- sprintf(comp,"%p",histBloqElemento(0)->dir);
- for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
- if(i!=nbloq-1){
- sprintf(comp,"%p",histBloqElemento(i+1)->dir);
- }
- }
- }
- if(i<nbloq && nbloq!=0){
- p=histBloqElemento(i)->dir;
- if(histBloqElemento(i)->Bytes<Bytes){
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- }else if(nshared!=0){
- char comp2[20];
- sprintf(comp2,"%p",histSharedElemento(0)->dir);
- for(i=0;i<nshared && strcmp(comp2,trozos[1])!=0 ;i++){
- if(i!=nshared-1){
- sprintf(comp2,"%p",histSharedElemento(i+1)->dir);
- }
- }
- if(i<nshared){
- p=histSharedElemento(i)->dir;
- if(histSharedElemento(i)->Bytes<Bytes){
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- }else{
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- }else{
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- }else{
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- printf("Llenando %d bytes de memoria con el byte %c(%02x) a partir de la direccion %p\n",Bytes,A,A,p);
- LlenarMemoria(p,Bytes,(unsigned char)A);
- }
- void cmdMemdump(){
- int i, numbytes;
- char *p,*q,*r;
- if(numtrozos > 2){
- numbytes = atoi(trozos[2]);
- }
- else{
- numbytes = 25;
- }
- if(nbloq!=0 || nshared!=0){
- if(nbloq!=0){
- char comp[20];
- sprintf(comp,"%p",histBloqElemento(0)->dir);
- for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
- if(i!=nbloq-1){
- sprintf(comp,"%p",histBloqElemento(i+1)->dir);
- }
- }
- }
- if(i<nbloq && nbloq!=0){
- p=(char *)histBloqElemento(i)->dir;
- if(histBloqElemento(i)->Bytes<numbytes){
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- }else if(nshared!=0){
- char comp2[20];
- sprintf(comp2,"%p",histSharedElemento(0)->dir);
- for(i=0;i<nshared && strcmp(comp2,trozos[1])!=0 ;i++){
- if(i!=nshared-1){
- sprintf(comp2,"%p",histSharedElemento(i+1)->dir);
- }
- }
- if(i<nshared){
- p=(char *)histSharedElemento(i)->dir;
- if(histSharedElemento(i)->Bytes<numbytes){
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- }else{
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- }else{
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- }else{
- printf("Violacion de segmento generado\n");
- exit(0);
- }
- printf("Volcando %d bytes desde la direccion %p\n", numbytes, p);
- q=p;
- r=p;
- int mod = numbytes % 25;
- for(int j=0;j<numbytes/25;j++){
- for(i=0;i<numbytes&&i<25;i++,r++){
- printf("%2c ",*r);
- }
- printf("\n");
- for(i=0;i<numbytes&&i<25;i++,q++){
- char buf[10];
- sprintf(buf,"%x",*q);
- printf("%.2s ",buf);
- }
- printf("\n");
- }if(mod!=0){
- for(i=0;i<mod;i++,r++){
- printf("%2c ",*r);
- }
- printf("\n");
- for(i=0;i<mod;i++,q++){
- char buf[10];
- sprintf(buf,"%x",*q);
- printf("%.2s ",buf);
- }
- printf("\n");
- }
- }
- ssize_t LeerFichero (char *f, void *p, size_t cont)
- {
- struct stat s;
- ssize_t n;
- int df,aux;
- if (stat (f,&s)==-1 || (df=open(f,O_RDONLY))==-1)
- return -1;
- if (cont==-1) /* si pasamos -1 como bytes a leer lo leemos entero*/
- cont=s.st_size;
- if ((n=read(df,p,cont))==-1){
- aux=errno;
- close(df);
- errno=aux;
- return -1;
- }
- close (df);
- return n;
- }
- ssize_t EscribirFichero (char *f, void *p, size_t cont,int overwrite)
- {
- ssize_t n;
- int df,aux, flags=O_CREAT | O_EXCL | O_WRONLY;
- if (overwrite)
- flags=O_CREAT | O_WRONLY | O_TRUNC;
- if ((df=open(f,flags,0777))==-1)
- return -1;
- if ((n=write(df,p,cont))==-1){
- aux=errno;
- close(df);
- errno=aux;
- return -1;
- }
- close (df);
- return n;
- }
- void cmdIo(){
- if( (strcmp(trozos[1], "read") == 0)){
- ssize_t cont = -1;
- char *file;
- void *addr;
- file = trozos[2];
- addr = (void *) strtol(trozos[3], NULL, 16);
- if(numtrozos == 5){
- cont = atoi(trozos[4]);
- }
- if((cont = LeerFichero(file, addr, cont)) == -1){
- printf("Imposible leer fichero");
- }
- printf("leidos %ld bytes de %s en %p\n", cont, file, addr);
- }
- else if((strcmp(trozos[1], "write") == 0)){
- int fd=0, numbytes;
- char *file;
- void *addr;
- struct stat filestat;
- //Sobreescritura con -o
- if (numtrozos == 6 && strcmp(trozos[2], "-o") == 0) {
- file = trozos[3];
- if ((fd = open(file, O_WRONLY)) == -1) {
- return;
- }
- addr = (void *) strtol(trozos[4], NULL, 16);
- numbytes = atoi(trozos[5]);
- if (write(fd, addr, numbytes) == -1) {
- close(fd);
- } else {
- printf("escritos %d bytes en %s desde %p\n", numbytes, file, addr);
- close(fd);
- }
- } else if (numtrozos == 5) { //Sobreescritura sin -o
- file = trozos[2];
- if (stat(file, &filestat) == 0) {
- printf("Imposible escribir fichero: File exists\n");
- return;
- }
- addr = (void *) strtol(trozos[3], NULL, 16);
- numbytes = (int) atoi(trozos[4]);
- if (write(fd, addr, numbytes) == -1) {
- close(fd);
- return;
- } else {
- printf("escritos %d bytes en %s desde %p\n", numbytes, file, addr);
- close(fd);
- }
- }
- }
- else{
- printf("uso: e-s [read|write] ......");
- }
- }
- void Recursiva (int n)
- {
- char automatico[TAMANO];
- static char estatico[TAMANO];
- printf ("parametro:%3d(%p) array %p, arr estatico %p\n",n,&n,automatico, estatico);
- if (n>0)
- Recursiva(n-1);
- }
- void cmdRecurse(){
- if(numtrozos>1){
- Recursiva(atoi(trozos[1]));
- }else return;
- }
- void Do_pmap (void) /*sin argumentos*/
- { pid_t pid; /*hace el pmap (o equivalente) del proceso actual*/
- char elpid[32];
- char *argv[4]={"pmap",elpid,NULL};
- sprintf (elpid,"%d", (int) getpid());
- if ((pid=fork())==-1){
- perror ("Imposible crear proceso");
- return;
- }
- if (pid==0){
- if (execvp(argv[0],argv)==-1)
- perror("cannot execute pmap (linux, solaris)");
- argv[0]="procstat"; argv[1]="vm"; argv[2]=elpid; argv[3]=NULL;
- if (execvp(argv[0],argv)==-1)/*No hay pmap, probamos procstat FreeBSD */
- perror("cannot execute procstat (FreeBSD)");
- argv[0]="procmap",argv[1]=elpid;argv[2]=NULL;
- if (execvp(argv[0],argv)==-1) /*probamos procmap OpenBSD*/
- perror("cannot execute procmap (OpenBSD)");
- argv[0]="vmmap"; argv[1]="-interleave"; argv[2]=elpid;argv[3]=NULL;
- if (execvp(argv[0],argv)==-1) /*probamos vmmap Mac-OS*/
- perror("cannot execute vmmap (Mac-OS)");
- exit(1);
- }
- waitpid (pid,NULL,0);
- }
- void cmdMemory(){
- int i,j,k;
- if(numtrozos==1 || (numtrozos>1 && strcmp(trozos[1],"-all")==0)){
- printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
- printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
- printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
- printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
- printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
- printf("******Lista de bloques asignados para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- printf("%p \t %d %s %d %d:%02d %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
- }
- for(i=0;i<nshared;i++){
- printf("%p \t %d %s %d %d:%02d %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
- }
- for(i=0;i<nmmap;i++){
- printf("%p \t %d %s %d %d:%02d %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
- }
- }else{
- if(strcmp("-blocks",trozos[1])==0){
- printf("******Lista de bloques asignados para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- printf("%p \t %d %s %d %d:%02d %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
- }
- for(i=0;i<nshared;i++){
- printf("%p \t %d %s %d %d:%02d %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
- }
- for(i=0;i<nmmap;i++){
- printf("%p \t %d %s %d %d:%02d %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
- }
- }else if(strcmp("-pmap",trozos[1])==0){
- Do_pmap();
- }else if(strcmp("-funcs",trozos[1])==0){
- printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
- printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
- }else if(strcmp("-vars",trozos[1])==0){
- printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
- printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
- printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
- }
- }
- }
- //P3
- void MostrarEntorno(char **entorno, char *nombre_entorno){
- int i = 0;
- while(entorno[i] != NULL){
- printf("%p->%s[%d]=(%p) %s\n", &entorno[i], nombre_entorno, i, entorno[i], entorno[i]);
- i++;
- }
- }
- int BuscarVariable(char *var, char *e[]){
- int pos=0;
- char aux[MaxHist];
- strcpy(aux, var);
- strcat(aux, "=");
- while(e[pos]!=NULL)
- if(!strncmp(e[pos], aux, strlen(aux)))
- return pos;
- else
- pos++;
- errno=ENOENT;
- return(-1);
- }
- int CambiarVariable(char *var, char *valor, char *e[]){
- int pos;
- char *aux;
- if((pos=BuscarVariable(var, e)) == -1)
- return(-1);
- if(((aux)=(char *)malloc(strlen(var)+strlen(valor)+2)) == NULL)
- return -1;
- strcpy(aux, var);
- strcat(aux, "=");
- strcat(aux, valor);
- e[pos]=aux;
- return(pos);
- }
- void cmdPriority(){
- int w, i, j, z, m;
- if(numtrozos == 1){
- z = getpid();
- m = getpriority(0, z);
- printf("Prioridad del proceso %d es %d\n", z, m);
- }
- if(numtrozos == 2){
- i = atoi(trozos[1]);
- w = getpriority(0, i);
- printf("Prioridad del proceso %d es %d\n", i, w);
- }
- if(numtrozos == 3){
- i = atoi(trozos[1]);
- j = atoi(trozos[2]);
- setpriority(0, i, j);
- }
- }
- void cmdEntorno(){
- if(numtrozos == 1)
- MostrarEntorno(entorno, "agr3");
- if(numtrozos == 2 && (strcmp(trozos[1], "-addr") == 0)){
- printf("entorno: %p (almacenado en %p)\n", entorno, &entorno);
- printf("main arg3: %p (almacenado en %p)\n", entorno, &entorno);
- }
- if(numtrozos == 2 && (strcmp(trozos[1], "-environ") == 0))
- MostrarEntorno(environ, "environ");
- }
- void cmdCambiarVar(){
- char aux[1000];
- if(numtrozos == 4 && (strcmp(trozos[1], "-a") == 0))
- CambiarVariable(trozos[2], trozos[3], entorno);
- if(numtrozos == 4 && (strcmp(trozos[1], "-e") == 0))
- CambiarVariable(trozos[2], trozos[3], environ);
- if(numtrozos == 4 && (strcmp(trozos[1], "-p") == 0)){
- strcpy(aux, trozos[2]);
- strcat(aux, "=");
- strcat(aux, trozos[3]);
- CambiarVariable(trozos[2], trozos[3], environ);
- }
- }
- void cmdMostrarVar(){
- if(numtrozos == 1)
- MostrarEntorno(entorno, "arg3");
- else{
- int i = BuscarVariable(trozos[1], entorno);
- int w = BuscarVariable(trozos[1], environ);
- printf("main arg3: %s %p (almacenado en %p)\n", entorno[i], entorno[i], &entorno[i]);
- printf("environ: %s %p (almacenado en %p)\n", entorno[w], entorno[w], &entorno[w]);
- printf("getenv: %s %p\n", getenv(trozos[1]), getenv(trozos[1]));
- }
- }
- void cmdFork ()
- {
- pid_t pid;
- if ((pid=fork())==0){
- HistProcesosBorrar();
- printf ("ejecutando proceso %d\n", getpid());
- }
- else if (pid!=-1)
- waitpid (pid,NULL,0);
- }
- int ValorSenal(char * sen) /*devuelve el numero de senial a partir del nombre*/
- {
- int i;
- for (i=0; sigstrnum[i].nombre!=NULL; i++)
- if (!strcmp(sen, sigstrnum[i].nombre))
- return sigstrnum[i].senal;
- return -1;
- }
- char *NombreSenal(int sen) /*devuelve el nombre senal a partir de la senal*/
- { /* para sitios donde no hay sig2str*/
- int i;
- for (i=0; sigstrnum[i].nombre!=NULL; i++)
- if (sen==sigstrnum[i].senal)
- return sigstrnum[i].nombre;
- return ("SIGUNKNOWN");
- }
- void cmdListJobs(){
- int i;
- int status;
- pid_t pid;
- for(i=0;i<nprocesos;i++){
- pid=waitpid(HistProcesosElemento(i)->PID,&status,WNOHANG| WUNTRACED| WCONTINUED);
- if(pid==HistProcesosElemento(i)->PID){
- if(WIFEXITED(status)){
- strcpy(HistProcesosElemento(i)->status,"FINISHED");
- HistProcesos[i]->prioridad=-1;
- status=WIFEXITED(status);
- }else if(WIFSIGNALED(status) && (pid!=0 || HistProcesosElemento(i)->senal !=0)){
- //if(WTERMSIG(status)<=31){
- strcpy(HistProcesosElemento(i)->status,"SIGNALED");
- HistProcesos[i]->prioridad=-1;
- HistProcesosElemento(i)->senal=WTERMSIG(status);
- status=WIFSIGNALED(status);
- //}
- }else if(WIFSTOPPED(status)){
- strcpy(HistProcesosElemento(i)->status,"STOPPED");
- HistProcesosElemento(i)->senal=WSTOPSIG(status);
- status=WIFSTOPPED(status);
- }else if(HistProcesosElemento(i)->senal==0 && pid==0){
- strcpy(HistProcesosElemento(i)->status,"ACTIVE");
- }
- }
- if(HistProcesosElemento(i)->senal!=0){
- printf("%d \t %s p=%d %s %d %d:%02d %s (%s) %s\n",HistProcesosElemento(i)->PID,HistProcesosElemento(i)->usuario, HistProcesos[i]->prioridad,nombreMes(HistProcesosElemento(i)->month), HistProcesosElemento(i)->dia, HistProcesosElemento(i)->hora, HistProcesosElemento(i)->min, HistProcesosElemento(i)->status, NombreSenal(HistProcesosElemento(i)->senal),HistProcesosElemento(i)->nombre);
- }else printf("%d \t %s p=%d %s %d %d:%02d %s (%03d) %s\n",HistProcesosElemento(i)->PID,HistProcesosElemento(i)->usuario, HistProcesos[i]->prioridad,nombreMes(HistProcesosElemento(i)->month), HistProcesosElemento(i)->dia, HistProcesosElemento(i)->hora, HistProcesosElemento(i)->min, HistProcesosElemento(i)->status, HistProcesosElemento(i)->senal,HistProcesosElemento(i)->nombre);
- }
- }
- void cmdDelJobs(){
- int flagTERM;
- int flagSIG;
- int i,j;
- if(numtrozos==1){
- printf("Uso del comando: deljobs [-sig][-term]\n");
- }else{
- for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
- if(strcmp(trozos[i],"-term")==0) flagTERM = 1;
- if(strcmp(trozos[i], "-sig") == 0) flagSIG = 1;
- }
- if(flagTERM==1){
- for(i=0;i<nprocesos;){
- if(strcmp(HistProcesosElemento(i)->status,"FINISHED")==0){
- for(j=i;j<nprocesos-1;j++){
- HistProcesos[j]=HistProcesos[j+1];
- }
- nprocesos--;
- }else{
- i++;
- }
- }
- }
- if(flagSIG==1){
- for(i=0;i<nprocesos;){
- if(strcmp(HistProcesosElemento(i)->status,"SIGNALED")==0){
- for(j=i;j<nprocesos-1;j++){
- HistProcesos[j]=HistProcesos[j+1];
- }
- nprocesos--;
- }else{
- i++;
- }
- }
- }
- if(flagTERM==0 && flagSIG==0){
- printf("Uso del comando: deljobs [-sig][-term]\n");
- }
- }
- }
- void cmdJob(){
- int i;
- int flagFG=0;
- int pidbuscado;
- int pid;
- int status;
- for(i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
- if(strcmp(trozos[i],"-fg")==0) flagFG = 1;
- }
- if(numtrozos==1){
- cmdListJobs();
- }else if(numtrozos==2 && flagFG==0){
- pidbuscado=atoi(trozos[1]);
- for(i=0;i<nprocesos && HistProcesosElemento(i)->PID != pidbuscado;i++);
- if(i>=nprocesos){
- printf("No existe ese proceso\n");
- }else{
- pid=waitpid(HistProcesosElemento(i)->PID,&status,WNOHANG| WUNTRACED| WCONTINUED);
- if(pid==HistProcesosElemento(i)->PID){
- if(WIFEXITED(status)){
- strcpy(HistProcesosElemento(i)->status,"FINISHED");
- HistProcesos[i]->prioridad=-1;
- status=WIFEXITED(status);
- }else if(WIFSIGNALED(status) && (pid!=0 || HistProcesosElemento(i)->senal !=0)){
- //if(WTERMSIG(status)<=31){
- strcpy(HistProcesosElemento(i)->status,"SIGNALED");
- HistProcesos[i]->prioridad=-1;
- HistProcesosElemento(i)->senal=WTERMSIG(status);
- status=WIFSIGNALED(status);
- //}
- }else if(WIFSTOPPED(status)){
- strcpy(HistProcesosElemento(i)->status,"STOPPED");
- HistProcesosElemento(i)->senal=WSTOPSIG(status);
- status=WIFSTOPPED(status);
- }else if(HistProcesosElemento(i)->senal==0 && pid==0){
- strcpy(HistProcesosElemento(i)->status,"ACTIVE");
- }
- }
- if(HistProcesosElemento(i)->senal!=0){
- printf("%d \t %s p=%d %s %d %d:%02d %s (%s) %s\n",HistProcesosElemento(i)->PID,HistProcesosElemento(i)->usuario, HistProcesos[i]->prioridad,nombreMes(HistProcesosElemento(i)->month), HistProcesosElemento(i)->dia, HistProcesosElemento(i)->hora, HistProcesosElemento(i)->min, HistProcesosElemento(i)->status, NombreSenal(HistProcesosElemento(i)->senal),HistProcesosElemento(i)->nombre);
- }else printf("%d \t %s p=%d %s %d %d:%02d %s (%03d) %s\n",HistProcesosElemento(i)->PID,HistProcesosElemento(i)->usuario, HistProcesos[i]->prioridad,nombreMes(HistProcesosElemento(i)->month), HistProcesosElemento(i)->dia, HistProcesosElemento(i)->hora, HistProcesosElemento(i)->min, HistProcesosElemento(i)->status, HistProcesosElemento(i)->senal,HistProcesosElemento(i)->nombre);
- }
- }else if(numtrozos==2 && flagFG==1){
- printf("Uso del comando: job [-fg] pid\n");
- }else if(numtrozos>=3){
- if(flagFG==1){
- pidbuscado=atoi(trozos[2]);
- if(waitpid(pidbuscado,&status,0)==-1){
- printf("No existe ese proceso\n");
- }else{
- if(WIFEXITED(status)){
- printf("El proceso %d se cerró normalmente\n",pidbuscado);
- for(i=0;i<nprocesos && HistProcesosElemento(i)->PID != pidbuscado;i++);
- if(i<nprocesos){
- strcpy(HistProcesosElemento(i)->status,"FINISHED");
- }
- }
- if(WIFSIGNALED(status)){
- printf("El proceso %d se cerró con una señal\n",pidbuscado);
- for(i=0;i<nprocesos && HistProcesosElemento(i)->PID != pidbuscado;i++);
- if(i<nprocesos){
- strcpy(HistProcesosElemento(i)->status,"SIGNALED");
- HistProcesosElemento(i)->senal=WTERMSIG(status);
- }
- }
- }
- }else{
- printf("Uso del comando: job [-fg] pid\n");
- }
- }
- }
- const char * Ejecutable(const char* file){
- if(file[0]!='.'){
- char destino[20] = "/usr/bin/";
- char *destinos[] = {destino};
- strcat(destino,file);
- return destinos[0];
- }else return file;
- }
- void OurExecvpe(const char *file, char *const argv[], char *const envp[])
- {
- if( (execve(Ejecutable(file),argv, envp)==-1) ){
- perror("Imposible ejecutar: ");
- };
- }
- void cmdExecute(){
- int i,j;
- char* argv[TAMANO];
- char* envp[TAMANO];
- char x[TAMANO];
- char y[TAMANO];
- char entorno[TAMANO];
- bool flagEntorno=true;
- int var,cont=1;
- strcpy(x,getenv("XAUTHORITY"));
- strcpy(y,"XAUTHORITY=");
- strcat(y,x);
- if(numtrozos==2){
- envp[0]= (char *)"DISPLAY=:0.0";
- envp[1]=(char *)y;
- envp[2]=NULL;
- argv[0]= trozos[1];
- argv[1]= NULL;
- }else{
- if(!isupper(trozos[1][0])){
- envp[0]= (char *)"DISPLAY=:0.0";
- envp[1]=(char *)y;
- envp[2]=NULL;
- flagEntorno=false;
- argv[0]=trozos[1];
- for(i=2;i<numtrozos && i<20;i++){
- if(trozos[i][0]!='@'){
- argv[i-1]=trozos[i];
- }
- }
- argv[i-1]=NULL;
- }else{
- for(i=1;i<numtrozos;i++){
- for(j=0;j<strlen(trozos[i])-1 && isupper(trozos[i][j]);j++);
- if(j+1==strlen(trozos[i])){
- strcpy(entorno,trozos[i]);
- strcat(entorno,"=");
- strcat(entorno,getenv(trozos[i]));
- envp[i-1]=malloc(100);
- strcpy(envp[i-1],entorno);
- }else break;
- }
- envp[i-1]=NULL;
- argv[0]=malloc(100);
- strcpy(argv[0],trozos[i]);
- var=i;
- for(i=i+1;i<numtrozos && i<20;i++){
- if(trozos[i][0]!='@'){
- argv[cont]=malloc(100);
- strcpy(argv[cont],trozos[i]);
- cont++;
- }
- }
- if(var+1==numtrozos){
- argv[var-1]=NULL;
- } else argv[i-2]=NULL;
- }
- }
- for(i = 1; i < numtrozos && trozos[i][0] != '@' ; i++);
- if(i<numtrozos){
- if(trozos[i][0] == '@'){
- char *prioridad;
- int prioridadint;
- prioridad = trozos[i] + 1;
- prioridadint= atoi(prioridad);
- setpriority(PRIO_PROCESS,getpid(),prioridadint); //getpid() o 0
- }
- }
- if(flagEntorno==false){
- OurExecvpe(trozos[1],argv,envp);
- }else {
- OurExecvpe(argv[0],argv,envp);
- }
- for(i=0;i<TAMANO;i++){
- free(envp[i]); //Liberar
- }
- }
- //Comando ayuda
- void cmdAyuda() {
- if (numtrozos == 1) {
- printf("'ayuda cmd' donde cmd es uno de los siguientes comandos:\n"
- "fin salir bye fecha pid autores hist comando carpeta infosis ayuda\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "fin") == 0) {
- printf("fin \tTermina la ejecucion del shell\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "salir") == 0) {
- printf("salir \tTermina la ejecucion del shell\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "bye") == 0) {
- printf("bye \tTermina la ejecucion del shell\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "fecha") == 0) {
- printf("fecha [-d|.h\tMuestra la fecha y o la hora actual\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "pid") == 0) {
- printf("pid [-p]\tMuestra el pid del shell o de su proceso padre\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "autores") == 0) {
- printf("autores [-n|-l]\tMuestra los nombres y logins de los autores\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "hist") == 0) {
- printf("hist [-c|-N]\tMuestra el historico de comandos, con -c lo borra\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "comando") == 0) {
- printf("comando [-N]\tRepite el comando N (del historico)\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
- printf("carpeta [dir]\tCambia (o muestra) el directorio actual del shell\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
- printf("infosis \tMuestra informacion de la maquina donde corre el shell\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "ayuda") == 0) {
- printf("ayuda [cmd]\tMuestra ayuda sobre los comandos\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "create") == 0) {
- printf("create [-f] [name] Crea un directorio o un fichero (-f)\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "stat") == 0) {
- printf("stat [-long][-link][-acc] name1 name2 .. lista ficheros;\n-long: listado largo\n-acc: acesstime\n-link: si es enlace simbolico, el path contenido\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "list") == 0) {
- printf("list [-reca] [-recb] [-hid][-long][-link][-acc] n1 n2 .. lista contenidos de directorios\n-hid: incluye los ficheros ocultos\n-reca: recursivo (antes)\n-recb: recursivo (despues)\nresto parametros como stat\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "delete") == 0) {
- printf("delete [name1 name2 ..] Borra ficheros o directorios vacios\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "deltree") == 0) {
- printf("deltree [name1 name2 ..] Borra ficheros o directorios no vacios recursivamente\n");
- }
- }
- struct cm_entrada{
- char *cm_nombre;
- void (*cm_fun)();
- };
- struct cm_entrada cm_tabla[] = {
- {"autores", cmdAutores},
- {"ayuda", cmdAyuda},
- {"bye", cmdFin},
- {"carpeta", cmdCarpeta},
- {"comando", cmdComandoN},
- {"create", cmdCreate},
- {"delete", cmdDelete},
- {"fecha", cmdFecha},
- {"fin", cmdFin},
- {"hist", cmdHist},
- {"infosis", cmdInfosis},
- {"pid", cmdPid},
- {"salir", cmdFin},
- {"stat", cmdStat},
- {"list", cmdList},
- {"allocate",cmdAllocate},
- {"deallocate",cmdDeallocate},
- {"memdump",cmdMemdump},
- {"recurse",cmdRecurse},
- {"memory",cmdMemory},
- {"memfill",cmdMemfill},
- {"i-o",cmdIo},
- {"fork",cmdFork},
- {"listjobs",cmdListJobs},
- {"execute",cmdExecute},
- {"deljobs",cmdDelJobs},
- {"job",cmdJob},
- {"priority",cmdPriority},
- {"showenv",cmdEntorno},
- {"showvar",cmdMostrarVar},
- {"changevar",cmdCambiarVar},
- //Actualizar número en función de abajo (Actual 31)
- };
- void comprobarSiEsta(char *linea){
- int i,j;
- int pid;
- int status;
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- uid_t uid = geteuid();
- struct passwd *pws = getpwuid(uid);
- char aux[TAMANO], aux2[TAMANO];
- char *prioridad;
- int prioridadint;
- pid=fork();
- char *copialinea = strdup(linea);
- numtrozos = TrocearCadena(copialinea, trozos);
- for(i=0;i<31 && strcmp(cm_tabla[i].cm_nombre, trozos[0]) != 0;i++); //CAMBIAR
- if(pid==0){
- if(i<31){ //CAMBIAR
- if(strcmp(trozos[0],"execute")!=0 && strcmp(trozos[0],"listjobs")!=0 && strcmp(trozos[0],"deljobs")!=0 && strcmp(trozos[0],"job")!=0 && strcmp(trozos[0],"showenv")!=0 && strcmp(trozos[0],"priority")!=0 && strcmp(trozos[0],"showvar")!=0 && strcmp(trozos[0],"changevar")!=0){ ///////////////////////////////////////
- ejecutarComando(linea);
- }
- }else{
- if(strcmp(trozos[numtrozos-1],"&")!=0){
- //Programar *****
- trozos[numtrozos]=malloc(1000); //Hacer free
- for(i=1;i<numtrozos+1;i++){
- if(i==1){
- strcpy(aux,trozos[1]);
- trozos[1]=malloc(TAMANO);
- strcpy(trozos[1],trozos[0]);//AQUÍ
- }else{
- if(i%2==0){
- strcpy(aux2,trozos[i]);
- trozos[i]=malloc(TAMANO);
- strcpy(trozos[i],aux);
- }else{
- strcpy(aux,trozos[i]);
- trozos[i]=malloc(TAMANO);
- strcpy(trozos[i],aux2);
- }
- }
- }numtrozos++; //Aumentar trozos
- cmdExecute();
- }else{
- numtrozos--;
- //Con &
- //Programar *****
- trozos[numtrozos]=malloc(1000); //Hacer free
- for(i=1;i<numtrozos+1;i++){
- if(i==1){
- strcpy(aux,trozos[1]);
- trozos[1]=malloc(TAMANO);
- strcpy(trozos[1],trozos[0]);//AQUÍ
- }else{
- if(i%2==0){
- strcpy(aux2,trozos[i]);
- trozos[i]=malloc(TAMANO);
- strcpy(trozos[i],aux);
- }else{
- strcpy(aux,trozos[i]);
- trozos[i]=malloc(TAMANO);
- strcpy(trozos[i],aux2);
- }
- }
- }numtrozos++; //Aumentar trozos
- cmdExecute();
- }
- exit(0);
- }
- }else{
- if(strcmp(trozos[0],"execute")==0){
- ejecutarComando(linea);
- waitpid(-1,&status,0);
- }
- if(strcmp(trozos[0],"listjobs")==0){////////////////////////
- ejecutarComando(linea);
- waitpid(pid,&status,WNOHANG);
- }
- if(strcmp(trozos[0],"deljobs")==0){////////////////////////
- ejecutarComando(linea);
- waitpid(pid,&status,WNOHANG);
- }
- if(strcmp(trozos[0],"job")==0){////////////////////////
- ejecutarComando(linea);
- waitpid(pid,&status,WNOHANG);
- }
- if(strcmp(trozos[0],"showenv")==0){////////////////////////
- ejecutarComando(linea);
- waitpid(pid,&status,WNOHANG);
- }
- if(strcmp(trozos[0],"priority")==0){////////////////////////
- ejecutarComando(linea);
- waitpid(pid,&status,WNOHANG);
- }
- if(strcmp(trozos[0],"showvar")==0){////////////////////////
- ejecutarComando(linea);
- waitpid(pid,&status,WNOHANG);
- }
- if(strcmp(trozos[0],"changevar")==0){////////////////////////
- ejecutarComando(linea);
- waitpid(pid,&status,WNOHANG);
- }
- /*if( (strcmp(trozos[0],"salir")==0 || strcmp(trozos[0],"fin")==0 || strcmp(trozos[0],"bye")==0)){////////////////////////
- ejecutarComando(linea);
- waitpid(pid,&status,WNOHANG);
- }*/
- if(strcmp(trozos[numtrozos-1],"&")==0){
- //
- for(i=0;i<numtrozos && isupper(trozos[i][0]);i++);
- for(j=0;j<numtrozos && trozos[j][0]!='@';j++);
- if(j==numtrozos){
- histProcesoInsert(pid,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"ACTIVE",0,pws->pw_name, trozos[i],0);
- }else{
- prioridad = trozos[j] + 1;
- prioridadint= atoi(prioridad);
- histProcesoInsert(pid,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"ACTIVE",0,pws->pw_name, trozos[i],prioridadint);
- }
- //
- //waitpid(pid,&status,WNOHANG);
- }else{
- waitpid(-1,&status,0);
- }
- }
- free(copialinea);
- if(pid==0){
- exit(0);
- }
- }
- void ejecutarComando(char *linea){
- int i;
- if(numtrozos == 0) {return;}
- for( i=0; ; i++){
- if(cm_tabla[i].cm_nombre == NULL){
- printf("%s: comando no reconocido\n", trozos[0]);
- break;
- }
- if(strcmp(cm_tabla[i].cm_nombre, trozos[0]) == 0){
- cm_tabla[i].cm_fun();
- break;
- }
- }
- }
- int main(int argc, char *argv[], char *envp[]){
- while(1){
- entorno=envp;
- usleep(15000);
- printf("@>"); //Prompt
- if( fgets(linea, 4096, stdin) == NULL ){
- exit(0);
- }
- if(linea[0]!=10){
- comprobarSiEsta(linea);
- histInsert(linea);
- }
- }
- for(int i=0; i < nhist; i++){
- free(Hist[i]);
- }
- for(int i=0; i < nbloq; i++){
- free(histBloqElemento(i)->dir);
- free(HistBloq[i]);
- }
- for(int i=0; i < nshared; i++){
- free(histSharedElemento(i)->dir);
- free(HistShared[i]);
- }
- for(int i=0; i < nmmap; i++){
- free(histMmapElemento(i)->dir);
- free(HistMmap[i]);
- }
- HistProcesosBorrar();
- for(int i=0;i<MaxTrozos;i++){
- free (trozos[i]);
- }
- }
Add Comment
Please, Sign In to add comment