techno-

so

Jan 31st, 2023
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 61.06 KB | None | 0 0
  1. /*
  2.     Javier Sobrino González
  3.     Javier Loureiro Pérez
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <unistd.h>
  10. #include <time.h>
  11. #include <sys/types.h>
  12. #include <limits.h>
  13. #include <sys/stat.h>
  14. #include <errno.h>
  15. #include <sys/utsname.h>
  16. #include <pwd.h>
  17. #include <grp.h>
  18. #include <dirent.h>
  19. #include <sys/shm.h>
  20. #include <sys/mman.h>
  21. #include <fcntl.h>
  22. #include <sys/wait.h>
  23. #include <stdbool.h>
  24. #include <sys/resource.h>
  25. #include <ctype.h>
  26. #include "ListaHistorial.h"
  27. #include "ListaBloques.h"
  28. #include "ListaShared.h"
  29. #include "ListaMmap.h"
  30. #include "ListaProcesos.h"
  31.  
  32. void cmdCambiarVar();
  33. void MostrarEntorno();
  34. void cmdEntorno();
  35. int CambiarVariable();
  36. int BuscarVariable (char * var, char *e[]);
  37.  
  38. char **entorno;
  39. extern char **environ;
  40.  
  41. struct SEN{
  42.         char *nombre;
  43.         int senal;
  44. };
  45. static struct SEN sigstrnum[]={
  46.     {"HUP", SIGHUP},
  47.     {"INT", SIGINT},
  48.     {"QUIT", SIGQUIT},
  49.     {"ILL", SIGILL},
  50.     {"TRAP", SIGTRAP},
  51.     {"ABRT", SIGABRT},
  52.     {"IOT", SIGIOT},
  53.     {"BUS", SIGBUS},
  54.     {"FPE", SIGFPE},
  55.     {"KILL", SIGKILL},
  56.     {"USR1", SIGUSR1},
  57.     {"SEGV", SIGSEGV},
  58.     {"USR2", SIGUSR2},
  59.     {"PIPE", SIGPIPE},
  60.     {"ALRM", SIGALRM},
  61.     {"TERM", SIGTERM},
  62.     {"CHLD", SIGCHLD},
  63.     {"CONT", SIGCONT},
  64.     {"STOP", SIGSTOP},
  65.     {"TSTP", SIGTSTP},
  66.     {"TTIN", SIGTTIN},
  67.     {"TTOU", SIGTTOU},
  68.     {"URG", SIGURG},
  69.     {"XCPU", SIGXCPU},
  70.     {"XFSZ", SIGXFSZ},
  71.     {"VTALRM", SIGVTALRM},
  72.     {"PROF", SIGPROF},
  73.     {"WINCH", SIGWINCH},
  74.     {"IO", SIGIO},
  75.     {"SYS", SIGSYS},
  76. /*senales que no hay en todas partes*/
  77. #ifdef SIGPOLL
  78.     {"POLL", SIGPOLL},
  79. #endif
  80. #ifdef SIGPWR
  81.     {"PWR", SIGPWR},
  82. #endif
  83. #ifdef SIGEMT
  84.     {"EMT", SIGEMT},
  85. #endif
  86. #ifdef SIGINFO
  87.     {"INFO", SIGINFO},
  88. #endif
  89. #ifdef SIGSTKFLT
  90.     {"STKFLT", SIGSTKFLT},
  91. #endif
  92. #ifdef SIGCLD
  93.     {"CLD", SIGCLD},
  94. #endif
  95. #ifdef SIGLOST
  96.     {"LOST", SIGLOST},
  97. #endif
  98. #ifdef SIGCANCEL
  99.     {"CANCEL", SIGCANCEL},
  100. #endif
  101. #ifdef SIGTHAW
  102.     {"THAW", SIGTHAW},
  103. #endif
  104. #ifdef SIGFREEZE
  105.     {"FREEZE", SIGFREEZE},
  106. #endif
  107. #ifdef SIGLWP
  108.     {"LWP", SIGLWP},
  109. #endif
  110. #ifdef SIGWAITING
  111.     {"WAITING", SIGWAITING},
  112. #endif
  113.     {NULL,-1},
  114.     };    /*fin array sigstrnum */
  115.  
  116.  
  117. #define MaxTrozos 512
  118. #define MaxHist 4096
  119. #define TAMANO 2048
  120.  
  121.  
  122. char linea[4096];
  123. char *trozos[MaxTrozos];
  124. int numtrozos;
  125.  
  126. int EntraEnBloque=0;
  127. int EntraEnShared=0;
  128. int EntraEnMmap=0;
  129.  
  130. static int varMem;
  131. static int varMem2;
  132. static int varMem3;
  133.  
  134. void ejecutarComando(char *linea);
  135.  
  136. int TrocearCadena(char * cadena, char * trozos[]){
  137.     int i=1;
  138.     if ((trozos[0]=strtok(cadena," \n\t"))==NULL)
  139.     return 0;
  140.     while ((trozos[i]=strtok(NULL," \n\t"))!=NULL)
  141.         i++;
  142.     return i;
  143. }
  144.  
  145.  
  146. //Comandos del shell
  147.  
  148. //Comando autores
  149. void cmdAutores(){
  150.  
  151.     char flagLogin= 1, flagNombre=1;
  152.  
  153.     if(numtrozos > 1 && strcmp(trozos[1], "-l") == 0)
  154.         flagNombre= 0;
  155.     if(numtrozos > 1 && strcmp(trozos[1], "-n") == 0)
  156.         flagLogin = 0;
  157.  
  158.     if(flagLogin){
  159.         printf("Login: j.loureirop\n");
  160.         printf("Login: javier.sobrino\n");
  161.     }
  162.     if(flagNombre){
  163.         printf("Nombre: Javier Loureiro\n");
  164.         printf("Nombre: Javier Sobrino\n");
  165.     }
  166. }
  167.  
  168. //Comando Fin (sale del shell)
  169. void cmdFin(){
  170.     exit(0);
  171. }
  172.  
  173. //Comando Pid
  174. void cmdPid(){
  175.  
  176.     if(numtrozos == 1)
  177.         printf("Pid del shell: %d\n", getpid());
  178.     else if (numtrozos > 1)
  179.         printf("Pid del padre del shell: %d\n", getppid());
  180. }
  181.  
  182.  
  183. //Comando Carpeta
  184. void cmdCarpeta(){
  185.     char ruta[PATH_MAX];
  186.  
  187.     if(numtrozos == 1){
  188.         if(getcwd(ruta, PATH_MAX) == NULL){
  189.             perror("getcwd");
  190.             return;
  191.         }
  192.         else{
  193.             printf("%s\n", ruta);
  194.             return;
  195.         }
  196.     }
  197.     else if(numtrozos > 1){
  198.         if (chdir(trozos[1]) == -1) {perror("chdir"); return;}
  199.         else
  200.             chdir(trozos[1]);
  201.     }
  202. }
  203.  
  204. //Comando comandoN
  205. void cmdComandoN(){
  206.     int n;
  207.  
  208.     if(numtrozos == 1) {printf("Falta número de comando \n"); return;}
  209.     n = atoi(trozos[1]);
  210.  
  211.     if(n < 0 || n >= histNumElementos()) {printf("Número de comando fuera de rango \n"); return;}
  212.     else {
  213.         printf(" %s",histElemento(n));
  214.     }
  215. }
  216.  
  217. //Comando fecha
  218. void cmdFecha(){
  219.  
  220.     struct tm *t;
  221.     time_t tiempo;
  222.  
  223.     if(time(&tiempo) == -1) {perror("time"); return;}
  224.     t = localtime(&tiempo);
  225.  
  226.     if(numtrozos > 1 && strcmp(trozos[1], "-d") == 0)
  227.         printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
  228.     else if(numtrozos > 1 && strcmp(trozos[1], "-h") == 0)
  229.         printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
  230.     else{
  231.         printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
  232.         printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
  233.     }
  234.  
  235. }
  236.  
  237. //Comando historial
  238. void histImprimeN(){
  239.     int i;
  240.  
  241.     for(i = 0; i <= trozos[1][1] - 48; i++){
  242.         printf("%d->%s", i, histElemento(i));
  243.     }
  244. }
  245.  
  246. void cmdHist(){
  247.     int i;
  248.  
  249.     if(numtrozos == 1){
  250.         for(i = 0; i < histNumElementos() ; i++){
  251.         printf("%d->%s", i, histElemento(i));
  252.         }
  253.     }
  254.     else if(numtrozos > 1 && strcmp(trozos[1], "-c") == 0){
  255.         histBorrar();
  256.         return;
  257.     }
  258.     else if(numtrozos > 1)
  259.         histImprimeN();
  260. }
  261.  
  262. //Comando infosis
  263. void cmdInfosis(){
  264.     struct utsname system;
  265.     uname(&system);
  266.  
  267.     printf("%s (%s), OS: %s %s-%s\n", system.nodename, system.machine, system.sysname,
  268.                                                                 system.release, system.version);
  269. }
  270.  
  271. /*PRACTICA 1*/
  272.  
  273. //Comando create
  274. void cmdCreate(){
  275.     char ruta[PATH_MAX];
  276.     if (numtrozos==1){
  277.         getcwd(ruta, PATH_MAX);
  278.         printf("%s\n", ruta);
  279.         return;
  280.     }else if(numtrozos==2){
  281.         if(strcmp(trozos[1],"-f")==0){
  282.         getcwd(ruta, PATH_MAX);
  283.         printf("%s\n", ruta);
  284.         return;
  285.         }else{
  286.         mkdir(trozos[1],0777);
  287.         if(errno != 0){
  288.         printf("Imposible crear: %s\n",strerror(errno));
  289.         }
  290.     }
  291.  
  292.     }else if(numtrozos==3){
  293.         if(strcmp(trozos[1], "-f")==0){
  294.         getcwd(ruta, PATH_MAX);
  295.         strcat(ruta,"/");
  296.         strcat(ruta,trozos[2]);
  297.  
  298.         FILE *fp;
  299.         fp = fopen(trozos[2],"w");
  300.         if(fp != NULL){
  301.         fclose(fp);
  302.         }
  303.         if(errno != 0){
  304.         printf("Imposible crear: %s\n",strerror(errno));
  305.         }
  306.  
  307.       }
  308.     }
  309.  
  310. }
  311. //Comando borrar
  312.  
  313. void cmdDelete(){
  314.     int i;
  315.     for(i=1;i<numtrozos;i++){
  316.  
  317.         if(errno != 0){
  318.         printf("%s\n",strerror(errno));
  319.         }
  320.         remove(trozos[i]);
  321.         if(errno != 0){
  322.         printf("%s\n",strerror(errno));
  323.         }
  324.         }
  325.  
  326.     }
  327.  
  328.  
  329.  
  330. //
  331.  
  332.  
  333. void st_mode_to_str(mode_t st_mode, char *mode){
  334.     mode[0]= ' '; //(S_ISDIR(fileStat.st_mode)) ? 'd' : '-';
  335.     mode[1]= (st_mode & S_IRUSR) ? 'r' : '-';
  336.     mode[2]= (st_mode & S_IWUSR) ? 'w' : '-';
  337.     mode[3]= (st_mode & S_IXUSR) ? 'x' : '-';
  338.     mode[4]= (st_mode & S_IRGRP) ? 'r' : '-';
  339.     mode[5]= (st_mode & S_IWGRP) ? 'w' : '-';
  340.     mode[6]= (st_mode & S_IXGRP) ? 'x' : '-';
  341.     mode[7]= (st_mode & S_IROTH) ? 'r' : '-';
  342.     mode[8]= (st_mode & S_IWOTH) ? 'w' : '-';
  343.     mode[9]= (st_mode & S_IXOTH) ? 'x' : '-';
  344.     mode[10]= 0;
  345.     }
  346.  
  347. //Comando stat
  348. void cmdStat(){
  349.  
  350.     struct stat *statbuf;
  351.     statbuf = malloc(sizeof(struct stat));
  352.  
  353.  
  354.     char ruta[PATH_MAX];
  355.     int flagLong=0, flagAcc=0, flagLink=0; //flags para detectar las opciones que se pasan
  356.     struct passwd *pws; //Id dispositivo
  357.     struct group *grp; //Id grupo
  358.     struct tm dtc, dta;
  359.  
  360.     //Introducen stat
  361.     if (numtrozos == 1)
  362.         cmdCarpeta();
  363.  
  364.     //Introducen stat (algo)
  365.     if(numtrozos == 2){
  366.  
  367.         getcwd(ruta, PATH_MAX);
  368.         strcat(ruta, "/");
  369.         strcat(ruta, trozos[1]);
  370.  
  371.         if(lstat(ruta, statbuf)== -1){
  372.             printf("Ha habido un error: %s\n", strerror(errno));
  373.         }
  374.         else{
  375.             printf("%ld %s\n", statbuf->st_size, trozos[1]);
  376.         }
  377.     }
  378.  
  379.     if(numtrozos>2){
  380.         //Obtenemos los flags que se pasan
  381.         for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  382.             if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
  383.             else if(strcmp(trozos[i],"-link") == 0) flagLink = 1;
  384.             else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
  385.         }
  386.  
  387.         getcwd(ruta, PATH_MAX);
  388.         strcat(ruta, "/");
  389.         strcat(ruta, trozos[numtrozos-1]);
  390.  
  391.         if(lstat(ruta, statbuf)== -1){
  392.             printf("Ha habido un error: %s\n", strerror(errno));
  393.         }
  394.         else{
  395.             pws = getpwuid(statbuf->st_uid);
  396.             grp = getgrgid(statbuf->st_gid);
  397.  
  398.             dtc = *(gmtime(&statbuf->st_ctime));
  399.             dta = *(gmtime(&statbuf->st_atime));
  400.  
  401.  
  402.             if(flagAcc == 1 && flagLong==0){
  403.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  404.                 dta.tm_hour+2, dta.tm_min);
  405.             }
  406.             if(flagLong==1){
  407.                 //strmode(st_mode, statbuf->st_mode);
  408.                 char mode[11];
  409.                 st_mode_to_str(statbuf->st_mode,mode);
  410.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  411.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  412.             }
  413.             if(flagLink==1){
  414.                 //hacer links
  415.             }
  416.             printf("%ld %s\n", statbuf->st_size, trozos[numtrozos-1]);
  417.         }
  418.     }
  419.  
  420. }
  421.  
  422.  
  423.  
  424. //Stat 2 (para list)
  425.  
  426. void cmdStat2(const char d_name[],int flagLong, int flagAcc, char ruta[], int REC){
  427.     struct stat *statbuf;
  428.     statbuf = malloc(sizeof(struct stat));
  429.  
  430.  
  431.  
  432.     struct passwd *pws; //Id dispositivo
  433.     struct group *grp; //Id grupo
  434.     struct tm dtc, dta;
  435.  
  436.  
  437.  
  438.     if(numtrozos>2){
  439.  
  440. if(REC==1){
  441.  
  442.         if(lstat(ruta, statbuf)== -1){
  443.         }
  444.         else{
  445.             pws = getpwuid(statbuf->st_uid);
  446.             grp = getgrgid(statbuf->st_gid);
  447.  
  448.             dtc = *(gmtime(&statbuf->st_ctime));
  449.             dta = *(gmtime(&statbuf->st_atime));
  450.  
  451.  
  452.             if(flagAcc == 1 && flagLong==0){
  453.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  454.                 dta.tm_hour+2, dta.tm_min);
  455.             }
  456.  
  457.             if(flagLong==1){
  458.                 //strmode(st_mode, statbuf->st_mode);
  459.                 char mode[11];
  460.                 st_mode_to_str(statbuf->st_mode,mode);
  461.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  462.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  463.             }
  464.             printf("%ld %s\n", statbuf->st_size, d_name);
  465.         }
  466.  
  467.       }
  468.  
  469.       else if(REC==0){
  470.  
  471.            if(lstat(d_name, statbuf)== -1){
  472.         }
  473.         else{
  474.             pws = getpwuid(statbuf->st_uid);
  475.             grp = getgrgid(statbuf->st_gid);
  476.  
  477.             dtc = *(gmtime(&statbuf->st_ctime));
  478.             dta = *(gmtime(&statbuf->st_atime));
  479.  
  480.  
  481.             if(flagAcc == 1 && flagLong==0){
  482.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  483.                 dta.tm_hour+2, dta.tm_min);
  484.             }
  485.  
  486.             if(flagLong==1){
  487.                 //strmode(st_mode, statbuf->st_mode);
  488.                 char mode[11];
  489.                 st_mode_to_str(statbuf->st_mode,mode);
  490.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  491.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  492.             }
  493.             printf("%ld %s\n", statbuf->st_size, ruta);
  494.         }
  495.  
  496.           }
  497.     }
  498.  
  499. }
  500.  
  501.  
  502. void cmdListaREC(const char *dirname,int fun, int flagHid, int flagLong){
  503.     if(fun==0){
  504.  
  505.     DIR* dir = opendir(dirname);
  506.  
  507.     struct dirent* dirent;
  508.     dirent = readdir(dir);
  509.     char path[100];
  510.  
  511.  
  512.  
  513.  
  514.   if (dir == NULL) {
  515.         return;
  516.     }
  517.  
  518.     printf("************%s\n",dirname);
  519.  
  520.  
  521.     while (dirent != NULL) {
  522.         strcpy(path, dirname);
  523.         strcat(path, "/");
  524.         strcat(path, dirent->d_name);
  525.  
  526.         if(dirent->d_name[0] != '.' || flagHid == 1){
  527.             if(flagLong==1){
  528.                 cmdStat2(dirent->d_name,1,1,path,1);
  529.                 }else{
  530.                     printf("%hhd %s\n", dirent->d_type, dirent->d_name);
  531.                     }
  532.         }
  533.  
  534.         dirent = readdir(dir);
  535.     }
  536.  
  537.     closedir(dir);
  538.  
  539.  
  540.     dir = opendir(dirname);
  541.     if (dir == NULL) {
  542.         return;
  543.     }
  544.  
  545.  
  546.     dirent = readdir(dir);
  547.     while (dirent != NULL) {
  548.  
  549.  
  550.  
  551.        if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.'|| flagHid==1)){
  552.  
  553.            char path[100];
  554.             strcpy(path, dirname);
  555.             strcat(path, "/");
  556.             strcat(path, dirent->d_name);
  557.             cmdListaREC(path,0,flagHid,flagLong);
  558.         }
  559.         dirent = readdir(dir);
  560.     }
  561.  
  562.     closedir(dir);
  563.  
  564.     }
  565.  
  566.     else if (fun==1){
  567.  
  568.  
  569.  
  570.     DIR* dir = opendir(dirname);
  571.  
  572.     struct dirent* dirent;
  573.     dirent = readdir(dir);
  574.  
  575.  
  576.     if (dir == NULL) {
  577.         return;
  578.     }
  579.  
  580.  
  581.     while (dirent != NULL) {
  582.  
  583.         if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.' || flagHid ==1)) {
  584.             char path[100];
  585.             printf("************%s/%s\n",dirname,dirent->d_name);
  586.             strcpy(path, dirname);
  587.             strcat(path, "/");
  588.             strcat(path, dirent->d_name);
  589.             cmdListaREC(path,1,flagHid,flagLong);
  590.             printf("************%s\n",dirname);
  591.         }
  592.  
  593.         dirent = readdir(dir);
  594.     }
  595.  
  596.     closedir(dir);
  597.  
  598.  
  599.     dir = opendir(dirname);
  600.     if (dir == NULL) {
  601.         return;
  602.     }
  603.  
  604.  
  605.     dirent = readdir(dir);
  606.     while (dirent != NULL) {
  607.         char path[100];
  608.         strcpy(path, dirname);
  609.         strcat(path, "/");
  610.         strcat(path, dirent->d_name);
  611.  
  612.        if(dirent->d_name[0] != '.' || flagHid == 1){
  613.             if(flagLong==1){
  614.                 cmdStat2(dirent->d_name,1,1,path,1);
  615.                 }else{
  616.                     printf("%hhd %s\n", dirent->d_type, dirent->d_name);
  617.                     }
  618.         }
  619.  
  620.         dirent = readdir(dir);
  621.     }
  622.  
  623.     closedir(dir);
  624.  
  625.     }
  626. }
  627.  
  628. //Comando list
  629. void cmdList(){
  630.  
  631.  
  632.     char ruta[PATH_MAX];
  633.     int flagHid=0,flagLong=0, flagAcc=0, flagReca=0, flagRecb=0; //flags para detectar las opciones que se pasan
  634.  
  635.  
  636.     DIR *d;
  637.     struct dirent *dirent;
  638.     getcwd(ruta, PATH_MAX);
  639.     strcat(ruta, "/");
  640.     strcat(ruta, trozos[numtrozos-1]);
  641.  
  642.     if(numtrozos==1)
  643.         cmdCarpeta();
  644.  
  645.     if(numtrozos==2){
  646.  
  647.  
  648.         if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
  649.         printf("************%s\n",trozos[numtrozos-1]);
  650.         while((dirent = readdir(d))!= NULL){
  651.             if(dirent->d_name[0] != '.'){
  652.             printf("%s\n", dirent->d_name);
  653.         }
  654.        }
  655.     }
  656.  
  657.  
  658.     if(numtrozos>2){
  659.  
  660.  
  661.  
  662.         //Obtenemos los flags que se pasan
  663.         for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  664.             if(strcmp(trozos[i],"-hid")==0) flagHid = 1;
  665.             else if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
  666.             else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
  667.             else if(strcmp(trozos[i], "-reca") == 0) flagReca = 1;
  668.             else if(strcmp(trozos[i], "-recb") == 0) flagRecb = 1;
  669.         }
  670.  
  671.  
  672.     if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
  673.  
  674.  
  675.  
  676.         if(flagAcc==1 && flagLong==0 && flagHid==0){
  677.             printf("************%s\n",trozos[numtrozos-1]);
  678.             while((dirent = readdir(d))!= NULL){
  679.             getcwd(ruta, PATH_MAX);
  680.             strcat(ruta,"/");
  681.             strcat(ruta,trozos[numtrozos-1]);
  682.             strcat(ruta,"/");
  683.             strcat(ruta,dirent->d_name);
  684.             if(dirent->d_name[0] != '.'){
  685.             cmdStat2(ruta,0,1,dirent->d_name,0);
  686.         }
  687.        }
  688.     }//
  689.  
  690.         if(flagAcc==1 && flagLong==0 && flagHid==1){
  691.             printf("************%s\n",trozos[numtrozos-1]);
  692.             while((dirent = readdir(d))!= NULL){
  693.             getcwd(ruta, PATH_MAX);
  694.             strcat(ruta,"/");
  695.             strcat(ruta,trozos[numtrozos-1]);
  696.             strcat(ruta,"/");
  697.             strcat(ruta,dirent->d_name);
  698.             cmdStat2(ruta,0,1,dirent->d_name,0);
  699.        }
  700.     }//
  701.  
  702.         if(flagHid==1 && flagLong==0 && flagAcc==0 && flagReca==0 && flagRecb==0){
  703.             printf("************%s\n",trozos[numtrozos-1]);
  704.             while((dirent = readdir(d))!= NULL){
  705.             printf("%s\n", dirent->d_name);
  706.         }
  707.       }
  708.  
  709.       if(flagLong==1 && flagHid == 0 && flagAcc==0 && flagReca==0 && flagRecb==0){
  710.  
  711.  
  712.           printf("************%s\n",trozos[numtrozos-1]);
  713.             while((dirent = readdir(d))!= NULL){
  714.             getcwd(ruta, PATH_MAX);
  715.             strcat(ruta,"/");
  716.             strcat(ruta,trozos[numtrozos-1]);
  717.             strcat(ruta,"/");
  718.             strcat(ruta,dirent->d_name);
  719.             if(dirent->d_name[0] != '.'){
  720.             cmdStat2(ruta,1,0,dirent->d_name,0);
  721.         }
  722.        }
  723.       }
  724.  
  725.  
  726.       if(flagLong==1 && flagHid == 1 && flagReca ==0 && flagRecb==0){
  727.           printf("************%s\n",trozos[numtrozos-1]);
  728.             while((dirent = readdir(d))!= NULL){
  729.             getcwd(ruta, PATH_MAX);
  730.             strcat(ruta,"/");
  731.             strcat(ruta,trozos[numtrozos-1]);
  732.             strcat(ruta,"/");
  733.             strcat(ruta,dirent->d_name);
  734.             cmdStat2(ruta,1,0,dirent->d_name,0);
  735.        }
  736.       }
  737.  
  738.  
  739.       if(flagReca==1){
  740.         cmdListaREC(trozos[numtrozos-1],0,flagHid, flagLong);
  741.       }else if(flagRecb==1){
  742.         cmdListaREC(trozos[numtrozos-1],1,flagHid, flagLong);
  743.       }
  744.  
  745.  
  746.     }
  747. }
  748.  
  749. // PRÁCTICA 2
  750.  
  751. char * nombreMes(int mes){
  752.     static char* meses[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
  753.     return meses[mes-1];
  754. }
  755.  
  756. void * ObtenerMemoriaShmget (key_t clave, size_t tam)
  757. {
  758.     void * p;
  759.     int aux,id,flags=0777;
  760.     struct shmid_ds s;
  761.     time_t t = time(NULL);
  762.     struct tm tm = *localtime(&t);
  763.  
  764.     if (tam)     /*tam distito de 0 indica crear */
  765.         flags=flags | IPC_CREAT | IPC_EXCL;
  766.     if (clave==IPC_PRIVATE)  /*no nos vale*/
  767.         {errno=EINVAL; return NULL;}
  768.     if ((id=shmget(clave, tam, flags))==-1)
  769.         return (NULL);
  770.     if ((p=shmat(id,NULL,0))==(void*) -1){
  771.         aux=errno;
  772.         if (tam)
  773.              shmctl(id,IPC_RMID,NULL);
  774.         errno=aux;
  775.         return (NULL);
  776.     }
  777.     shmctl (id,IPC_STAT,&s);
  778.     histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
  779.     return (p);
  780. }
  781.  
  782.  
  783. void * ObtenerMemoriaShmget2 (key_t clave, size_t tam)
  784. {
  785.     void * p;
  786.     int aux,id;
  787.     struct shmid_ds s;
  788.     time_t t = time(NULL);
  789.     struct tm tm = *localtime(&t);
  790.     if (clave==IPC_PRIVATE)  /*no nos vale*/
  791.         {
  792.         errno=EINVAL; return NULL;
  793.         }
  794.     if ((id=shmget(clave, tam, 0))==-1){
  795.         return (NULL);
  796.         }
  797.     if ((p=shmat(id,NULL,0))==(void*) -1){
  798.         aux=errno;
  799.         if (tam)
  800.              shmctl(id,IPC_RMID,NULL);
  801.         errno=aux;
  802.         return (NULL);
  803.     }
  804.     shmctl (id,IPC_STAT,&s);
  805.     histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
  806.     return (p);
  807. }
  808.  
  809. void * MapearFichero (char * fichero, int protection)
  810. {
  811.     int df, map=MAP_PRIVATE,modo=O_RDONLY;
  812.     struct stat s;
  813.     void *p;
  814.     time_t t = time(NULL);
  815.     struct tm tm = *localtime(&t);
  816.  
  817.     if (protection&PROT_WRITE)
  818.           modo=O_RDWR;
  819.     if (stat(fichero,&s)==-1 || (df=open(fichero, modo))==-1)
  820.           return NULL;
  821.     if ((p=mmap (NULL,s.st_size, protection,map,df,0))==MAP_FAILED)
  822.            return NULL;
  823.     histMmapInsert(p, s.st_size,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,trozos[2],df);
  824.     return p;
  825. }
  826.  
  827.  
  828. void cmdAllocate(){
  829.         int *p;
  830.         int i;
  831.         time_t t = time(NULL);
  832.         struct tm tm = *localtime(&t);
  833.  
  834.         if(numtrozos==1){
  835.             printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  836.             for(i=0;i<nbloq;i++){
  837.                 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);
  838.             }
  839.             for(i=0;i<nshared;i++){
  840.                 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);
  841.             }
  842.             for(i=0;i<nmmap;i++){
  843.                 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);
  844.             }
  845.             //////////IMPRIMIR RESTO DE LISTAS
  846.         }
  847.         else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
  848.             if(numtrozos==2){
  849.                 printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
  850.             for(i=0;i<nbloq;i++){
  851.                 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);
  852.              }
  853.             }
  854.             else if(strcmp(trozos[2],"0")==0){
  855.                 printf("No se asignan bloques de 0 bytes\n");
  856.             }else{
  857.                 p=malloc(atoi(trozos[2]));
  858.                 printf("Asignados %s bytes en %p\n",trozos[2],p);
  859.                 histBloqInsert(p,atoi(trozos[2]),tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"malloc");
  860.                 }
  861.         }
  862.         else if(numtrozos>1 && strcmp(trozos[1],"-createshared")==0){
  863.  
  864.         key_t cl;
  865.         size_t tam;
  866.         void *p;
  867.  
  868.         if(numtrozos==2 || numtrozos==3){
  869.             printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
  870.             for(i=0;i<nshared;i++){
  871.                 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);
  872.             }
  873.         }else{
  874.  
  875.         cl=(key_t)  strtoul(trozos[2],NULL,10);
  876.         tam=(size_t) strtoul(trozos[3],NULL,10);
  877.         if (tam==0) {
  878.             printf ("No se asignan bloques de 0 bytes\n");
  879.             return;
  880.         }
  881.         if ((p=ObtenerMemoriaShmget(cl,tam))!=NULL)
  882.             printf ("Asignados %lu bytes en %p\n",(unsigned long) tam, p);
  883.         else
  884.             printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
  885.     }
  886. }
  887.  
  888.         else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
  889.  
  890.             if(numtrozos==2){
  891.             printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
  892.             for(i=0;i<nshared;i++){
  893.                 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);
  894.             }
  895.         }else{
  896.  
  897.         key_t cl;
  898.         size_t tam;
  899.         void *p;
  900.  
  901.         for(i=0;i<nshared && histSharedElemento(i)->key!=atoi(trozos[2]);i++);
  902.  
  903.  
  904.         cl=(key_t)  strtoul(trozos[2],NULL,10);
  905.         tam=(size_t) (i<nshared) ? histSharedElemento(i)->Bytes : 10;
  906.         if (tam==0) {
  907.             printf ("No se asignan bloques de 0 bytes\n");
  908.             return;
  909.         }
  910.  
  911.         if ((p=ObtenerMemoriaShmget2(cl,tam))!=NULL)
  912.             printf ("Memoria compartida de clave %d en %p\n",histSharedElemento(i)->key, p);
  913.         else
  914.             printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
  915.  
  916.         }
  917.     }
  918.  
  919.     else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
  920.  
  921.     if(numtrozos==2 || numtrozos==3){
  922.             printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
  923.             for(i=0;i<nmmap;i++){
  924.                 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);
  925.             }
  926.     }else{
  927.  
  928.      char *perm;
  929.      void *p;
  930.      int protection=0;
  931.  
  932.      if ((perm=trozos[3])!=NULL && strlen(perm)<4) {
  933.             if (strchr(perm,'r')!=NULL) protection|=PROT_READ;
  934.             if (strchr(perm,'w')!=NULL) protection|=PROT_WRITE;
  935.             if (strchr(perm,'x')!=NULL) protection|=PROT_EXEC;
  936.      }
  937.      if ((p=MapearFichero(trozos[2],protection))==NULL)
  938.              perror ("Imposible mapear fichero");
  939.      else
  940.              printf ("fichero %s mapeado en %p\n", trozos[2], p);
  941.  
  942.         }
  943.     }
  944. }
  945.  
  946. void do_DeallocateDelkey (char *key)
  947. {
  948.    key_t clave;
  949.    int id;
  950.  
  951.  
  952.    if (key==NULL || (clave=(key_t) strtoul(key,NULL,10))==IPC_PRIVATE){
  953.         printf ("      delkey necesita clave_valida\n");
  954.         return;
  955.    }
  956.    if ((id=shmget(clave,0,0666))==-1){
  957.         perror ("shmget: imposible obtener memoria compartida");
  958.         return;
  959.    }
  960.    if (shmctl(id,IPC_RMID,NULL)==-1)
  961.         perror ("shmctl: imposible eliminar memoria compartida\n");
  962. }
  963.  
  964. void cmdDeallocate(){
  965.     int i;
  966.  
  967.         if(numtrozos==1){
  968.             printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  969.             for(i=0;i<nbloq;i++){
  970.                 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);
  971.             }
  972.             for(i=0;i<nshared;i++){
  973.                 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);
  974.             }
  975.             for(i=0;i<nmmap;i++){
  976.                 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);
  977.             }
  978.             //////////IMPRIMIR RESTO DE LISTAS
  979.         }
  980.         else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
  981.             if(numtrozos==2){
  982.                 printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
  983.             for(i=0;i<nbloq;i++){
  984.                 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);
  985.              }
  986.             }
  987.             else if(strcmp(trozos[2],"0")==0){
  988.                 printf("No se asignan bloques de 0 bytes\n");
  989.             }else{
  990.                 if(nbloq ==0){
  991.                     printf("No hay bloque de ese tamaño asignado con malloc\n");
  992.                 }else{
  993.                 for(i=0;i<nbloq && histBloqElemento(i)->Bytes != atoi(trozos[2]) ;i++);
  994.                 if(i>=nbloq){
  995.                     printf("No hay bloque de ese tamaño asignado con malloc\n");
  996.                 }else{
  997.                     free(histBloqElemento(i)->dir);
  998.                     for(;i<nbloq-1;i++){
  999.                         HistBloq[i] =HistBloq[i+1];
  1000.                         }
  1001.                         nbloq--;
  1002.                     }
  1003.                 }
  1004.         }
  1005.  
  1006.         }else if(numtrozos>1 && strcmp(trozos[1],"-delkey")==0){
  1007.  
  1008.  
  1009.         if(numtrozos==2){
  1010.             printf("del_key necesita una clave válida\n");
  1011.         }else{
  1012.  
  1013.         do_DeallocateDelkey (trozos[2]);
  1014.     }
  1015. }
  1016.  
  1017.         else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
  1018.  
  1019.             if(numtrozos==2){
  1020.             printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
  1021.             for(i=0;i<nshared;i++){
  1022.                 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);
  1023.             }
  1024.         }else{
  1025.             if(nshared ==0){
  1026.                     printf("No hay bloque de esa clave mapeado en el proceso\n");
  1027.                 }else{
  1028.                 //NO HACER DEALLOCATE DELKEY
  1029.                 for(i=0;i<nshared && histSharedElemento(i)->key != atoi(trozos[2]) ;i++);
  1030.                 if(i>=nshared){
  1031.                     printf("No hay bloque de esa clave mapeado en el proceso\n");
  1032.                 }else{
  1033.                     for(;i<nshared-1;i++){
  1034.                         HistShared[i] =HistShared[i+1];
  1035.                         }
  1036.                         nshared--;
  1037.                     }
  1038.                 }
  1039.  
  1040.  
  1041.         }
  1042.     }
  1043.  
  1044.     else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
  1045.  
  1046.     if(numtrozos==2){
  1047.             printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
  1048.             for(i=0;i<nmmap;i++){
  1049.                 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);
  1050.             }
  1051.     }else{
  1052.         if(nmmap ==0){
  1053.                     printf("Fichero %s no mapeado\n",trozos[2]);
  1054.                 }else{
  1055.                 for(i=0;i<nmmap && strcmp(histMmapElemento(i)->nombre,trozos[2]) != 0 ;i++);
  1056.                 if(i>=nmmap){
  1057.                     printf("Fichero %s no mapeado\n",trozos[2]);
  1058.                 }else{
  1059.                     munmap(histMmapElemento(i)->dir,histMmapElemento(i)->Bytes);
  1060.                     for(;i<nmmap-1;i++){
  1061.                         HistMmap[i]=HistMmap[i+1];
  1062.                         }
  1063.                         nmmap--;
  1064.                     }
  1065.                 }
  1066.  
  1067.  
  1068.         }
  1069.     }
  1070.     else{
  1071.         int flagNoEsta=0;
  1072.         EntraEnBloque=0;
  1073.         EntraEnShared=0;
  1074.         EntraEnMmap=0;
  1075.  
  1076.         if(nbloq ==0 && nshared ==0 && nmmap ==0){
  1077.             printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
  1078.         }else{
  1079.  
  1080.         if(nbloq!=0){
  1081.         EntraEnBloque=1;
  1082.  
  1083.         char comp[20];
  1084.         sprintf(comp,"%p",histBloqElemento(0)->dir);
  1085.  
  1086.         for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
  1087.             if(i!=nbloq-1){
  1088.             sprintf(comp,"%p",histBloqElemento(i+1)->dir);
  1089.             }
  1090.         }
  1091.  
  1092.  
  1093.         if(i<nbloq){
  1094.  
  1095.                     free(histBloqElemento(i)->dir);
  1096.                     for(;i<nbloq-1;i++){
  1097.                         HistBloq[i] =HistBloq[i+1];
  1098.                         }
  1099.                         nbloq--;
  1100.                     }else{flagNoEsta++;}
  1101.  
  1102.           }if(nshared!=0){
  1103.             EntraEnShared=1;
  1104.  
  1105.             char comp[20];
  1106.             sprintf(comp,"%p",histSharedElemento(0)->dir);
  1107.  
  1108.             for(i=0;i<nshared && strcmp(comp,trozos[1])!=0 ;i++){
  1109.                 if(i!=nshared-1){
  1110.                 sprintf(comp,"%p",histSharedElemento(i+1)->dir);
  1111.                 }
  1112.             }
  1113.  
  1114.             if(i<nshared){
  1115.             //NO HACER DEALLOCATE DELKEY
  1116.                     for(;i<nshared-1;i++){
  1117.                         HistShared[i] =HistShared[i+1];
  1118.                         }
  1119.                         nshared--;
  1120.                     }else{flagNoEsta++;}
  1121.  
  1122.  
  1123.          }if(nmmap!=0){
  1124.              EntraEnMmap=1;
  1125.  
  1126.             char comp[20];
  1127.             sprintf(comp,"%p",histMmapElemento(0)->dir);
  1128.  
  1129.             for(i=0;i<nmmap && strcmp(comp,trozos[1])!=0 ;i++){
  1130.                 if(i!=nmmap-1){
  1131.                 sprintf(comp,"%p",histMmapElemento(i+1)->dir);
  1132.                 }
  1133.             }
  1134.  
  1135.             if(i<nmmap){
  1136.                     munmap(histMmapElemento(i)->dir,histMmapElemento(i)->Bytes);
  1137.                     for(;i<nmmap-1;i++){
  1138.                         HistMmap[i]=HistMmap[i+1];
  1139.                         }
  1140.                         nmmap--;
  1141.                     }else{flagNoEsta++;}
  1142.  
  1143.            }if((flagNoEsta==3) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnMmap) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnShared) || (flagNoEsta==1 && !EntraEnShared && !EntraEnMmap) || (flagNoEsta==2 && !EntraEnBloque) || (flagNoEsta==2 && !EntraEnShared) || (flagNoEsta==2 && !EntraEnMmap)){
  1144.  
  1145.                printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
  1146.                }
  1147.           }
  1148.         }
  1149. }
  1150.  
  1151. void LlenarMemoria (void *p, size_t cont, unsigned char byte)
  1152. {
  1153.   unsigned char *arr=(unsigned char *) p;
  1154.   size_t i;
  1155.  
  1156.   for (i=0; i<cont;i++)
  1157.         arr[i]=byte;
  1158. }
  1159.  
  1160. void cmdMemfill(){
  1161.     char A='A';
  1162.     int Bytes=128;
  1163.     int *p,i;
  1164.  
  1165.     if(numtrozos==1){
  1166.         return;
  1167.     }if(numtrozos>2){
  1168.         Bytes=atoi(trozos[2]);
  1169.     }
  1170.     if(numtrozos>3){
  1171.         A=trozos[3][0];
  1172.         }
  1173.     if(nbloq!=0 || nshared!=0){
  1174.     if(nbloq!=0){
  1175.     char comp[20];
  1176.         sprintf(comp,"%p",histBloqElemento(0)->dir);
  1177.  
  1178.         for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
  1179.             if(i!=nbloq-1){
  1180.             sprintf(comp,"%p",histBloqElemento(i+1)->dir);
  1181.             }
  1182.         }
  1183.  
  1184.     }
  1185.         if(i<nbloq && nbloq!=0){
  1186.             p=histBloqElemento(i)->dir;
  1187.             if(histBloqElemento(i)->Bytes<Bytes){
  1188.                 printf("Violacion de segmento generado\n");
  1189.                 exit(0);
  1190.             }
  1191.  
  1192.  
  1193.         }else if(nshared!=0){
  1194.             char comp2[20];
  1195.             sprintf(comp2,"%p",histSharedElemento(0)->dir);
  1196.  
  1197.             for(i=0;i<nshared && strcmp(comp2,trozos[1])!=0 ;i++){
  1198.                 if(i!=nshared-1){
  1199.                 sprintf(comp2,"%p",histSharedElemento(i+1)->dir);
  1200.                 }
  1201.             }
  1202.  
  1203.             if(i<nshared){
  1204.                 p=histSharedElemento(i)->dir;
  1205.                 if(histSharedElemento(i)->Bytes<Bytes){
  1206.                 printf("Violacion de segmento generado\n");
  1207.                 exit(0);
  1208.                 }
  1209.             }else{
  1210.                 printf("Violacion de segmento generado\n");
  1211.                 exit(0);
  1212.                 }
  1213.  
  1214.         }else{
  1215.                 printf("Violacion de segmento generado\n");
  1216.                 exit(0);
  1217.                 }
  1218.  
  1219.         }else{
  1220.                 printf("Violacion de segmento generado\n");
  1221.                 exit(0);
  1222.                 }
  1223.  
  1224.  
  1225.     printf("Llenando %d bytes de memoria con el byte %c(%02x) a partir de la direccion %p\n",Bytes,A,A,p);
  1226.     LlenarMemoria(p,Bytes,(unsigned char)A);
  1227. }
  1228.  
  1229.  
  1230. void cmdMemdump(){
  1231.     int i, numbytes;
  1232.     char *p,*q,*r;
  1233.  
  1234.     if(numtrozos > 2){
  1235.         numbytes = atoi(trozos[2]);
  1236.     }
  1237.     else{
  1238.         numbytes = 25;
  1239.     }
  1240.  
  1241.     if(nbloq!=0 || nshared!=0){
  1242.     if(nbloq!=0){
  1243.     char comp[20];
  1244.         sprintf(comp,"%p",histBloqElemento(0)->dir);
  1245.  
  1246.         for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
  1247.             if(i!=nbloq-1){
  1248.             sprintf(comp,"%p",histBloqElemento(i+1)->dir);
  1249.             }
  1250.         }
  1251.  
  1252.     }
  1253.         if(i<nbloq && nbloq!=0){
  1254.             p=(char *)histBloqElemento(i)->dir;
  1255.             if(histBloqElemento(i)->Bytes<numbytes){
  1256.                 printf("Violacion de segmento generado\n");
  1257.                 exit(0);
  1258.             }
  1259.  
  1260.  
  1261.         }else if(nshared!=0){
  1262.             char comp2[20];
  1263.             sprintf(comp2,"%p",histSharedElemento(0)->dir);
  1264.  
  1265.             for(i=0;i<nshared && strcmp(comp2,trozos[1])!=0 ;i++){
  1266.                 if(i!=nshared-1){
  1267.                 sprintf(comp2,"%p",histSharedElemento(i+1)->dir);
  1268.                 }
  1269.             }
  1270.  
  1271.             if(i<nshared){
  1272.                 p=(char *)histSharedElemento(i)->dir;
  1273.                 if(histSharedElemento(i)->Bytes<numbytes){
  1274.                 printf("Violacion de segmento generado\n");
  1275.                 exit(0);
  1276.                 }
  1277.             }else{
  1278.                 printf("Violacion de segmento generado\n");
  1279.                 exit(0);
  1280.                 }
  1281.  
  1282.         }else{
  1283.                 printf("Violacion de segmento generado\n");
  1284.                 exit(0);
  1285.                 }
  1286.  
  1287.         }else{
  1288.                 printf("Violacion de segmento generado\n");
  1289.                 exit(0);
  1290.                 }
  1291.  
  1292.     printf("Volcando %d bytes desde la direccion %p\n", numbytes, p);
  1293.     q=p;
  1294.     r=p;
  1295.     int mod = numbytes % 25;
  1296.  
  1297.     for(int j=0;j<numbytes/25;j++){
  1298.         for(i=0;i<numbytes&&i<25;i++,r++){
  1299.             printf("%2c ",*r);
  1300.             }
  1301.             printf("\n");
  1302.         for(i=0;i<numbytes&&i<25;i++,q++){
  1303.             char buf[10];
  1304.             sprintf(buf,"%x",*q);
  1305.             printf("%.2s ",buf);
  1306.             }
  1307.             printf("\n");
  1308.  
  1309.         }if(mod!=0){
  1310.             for(i=0;i<mod;i++,r++){
  1311.             printf("%2c ",*r);
  1312.             }
  1313.  
  1314.             printf("\n");
  1315.             for(i=0;i<mod;i++,q++){
  1316.             char buf[10];
  1317.             sprintf(buf,"%x",*q);
  1318.             printf("%.2s ",buf);
  1319.             }
  1320.  
  1321.  
  1322.             printf("\n");
  1323.          }
  1324.  
  1325. }
  1326.  
  1327. ssize_t LeerFichero (char *f, void *p, size_t cont)
  1328. {
  1329.    struct stat s;
  1330.    ssize_t  n;
  1331.    int df,aux;
  1332.  
  1333.    if (stat (f,&s)==-1 || (df=open(f,O_RDONLY))==-1)
  1334.     return -1;
  1335.    if (cont==-1)   /* si pasamos -1 como bytes a leer lo leemos entero*/
  1336.     cont=s.st_size;
  1337.    if ((n=read(df,p,cont))==-1){
  1338.     aux=errno;
  1339.     close(df);
  1340.     errno=aux;
  1341.     return -1;
  1342.    }
  1343.    close (df);
  1344.    return n;
  1345. }
  1346.  
  1347. ssize_t EscribirFichero (char *f, void *p, size_t cont,int overwrite)
  1348. {
  1349.    ssize_t  n;
  1350.    int df,aux, flags=O_CREAT | O_EXCL | O_WRONLY;
  1351.  
  1352.    if (overwrite)
  1353.     flags=O_CREAT | O_WRONLY | O_TRUNC;
  1354.  
  1355.    if ((df=open(f,flags,0777))==-1)
  1356.     return -1;
  1357.  
  1358.    if ((n=write(df,p,cont))==-1){
  1359.     aux=errno;
  1360.     close(df);
  1361.     errno=aux;
  1362.     return -1;
  1363.    }
  1364.    close (df);
  1365.    return n;
  1366. }
  1367.  
  1368.  
  1369. void cmdIo(){
  1370.  
  1371.     if( (strcmp(trozos[1], "read") == 0)){
  1372.         ssize_t cont = -1;
  1373.         char *file;
  1374.         void *addr;
  1375.  
  1376.         file = trozos[2];
  1377.         addr = (void *) strtol(trozos[3], NULL, 16);
  1378.  
  1379.         if(numtrozos == 5){
  1380.             cont = atoi(trozos[4]);
  1381.         }
  1382.  
  1383.         if((cont = LeerFichero(file, addr, cont)) == -1){
  1384.             printf("Imposible leer fichero");
  1385.         }
  1386.         printf("leidos %ld bytes de %s en %p\n", cont, file, addr);
  1387.     }
  1388.     else if((strcmp(trozos[1], "write") == 0)){
  1389.         int fd=0, numbytes;
  1390.         char *file;
  1391.         void *addr;
  1392.         struct stat filestat;
  1393.  
  1394.         //Sobreescritura con -o
  1395.         if (numtrozos == 6 && strcmp(trozos[2], "-o") == 0) {
  1396.             file = trozos[3];
  1397.             if ((fd = open(file, O_WRONLY)) == -1) {
  1398.                 return;
  1399.             }
  1400.             addr = (void *) strtol(trozos[4], NULL, 16);
  1401.             numbytes = atoi(trozos[5]);
  1402.             if (write(fd, addr, numbytes) == -1) {
  1403.                 close(fd);
  1404.             } else {
  1405.                 printf("escritos %d bytes en %s desde %p\n", numbytes, file, addr);
  1406.                 close(fd);
  1407.             }
  1408.         } else if (numtrozos == 5) { //Sobreescritura sin -o
  1409.             file = trozos[2];
  1410.             if (stat(file, &filestat) == 0) {
  1411.                 printf("Imposible escribir fichero: File exists\n");
  1412.                 return;
  1413.         }
  1414.  
  1415.         addr = (void *) strtol(trozos[3], NULL, 16);
  1416.         numbytes = (int) atoi(trozos[4]);
  1417.  
  1418.         if (write(fd, addr, numbytes) == -1) {
  1419.             close(fd);
  1420.             return;
  1421.         } else {
  1422.             printf("escritos %d bytes en %s desde %p\n", numbytes, file, addr);
  1423.             close(fd);
  1424.             }
  1425.         }
  1426.     }
  1427.     else{
  1428.         printf("uso: e-s [read|write] ......");
  1429.     }
  1430. }
  1431.  
  1432.  
  1433. void Recursiva (int n)
  1434. {
  1435.   char automatico[TAMANO];
  1436.   static char estatico[TAMANO];
  1437.  
  1438.   printf ("parametro:%3d(%p) array %p, arr estatico %p\n",n,&n,automatico, estatico);
  1439.  
  1440.   if (n>0)
  1441.     Recursiva(n-1);
  1442. }
  1443.  
  1444. void cmdRecurse(){
  1445.     if(numtrozos>1){
  1446.         Recursiva(atoi(trozos[1]));
  1447.         }else return;
  1448. }
  1449.  
  1450. void Do_pmap (void) /*sin argumentos*/
  1451.  { pid_t pid;       /*hace el pmap (o equivalente) del proceso actual*/
  1452.    char elpid[32];
  1453.    char *argv[4]={"pmap",elpid,NULL};
  1454.  
  1455.    sprintf (elpid,"%d", (int) getpid());
  1456.    if ((pid=fork())==-1){
  1457.       perror ("Imposible crear proceso");
  1458.       return;
  1459.       }
  1460.    if (pid==0){
  1461.       if (execvp(argv[0],argv)==-1)
  1462.          perror("cannot execute pmap (linux, solaris)");
  1463.  
  1464.       argv[0]="procstat"; argv[1]="vm"; argv[2]=elpid; argv[3]=NULL;
  1465.       if (execvp(argv[0],argv)==-1)/*No hay pmap, probamos procstat FreeBSD */
  1466.          perror("cannot execute procstat (FreeBSD)");
  1467.  
  1468.       argv[0]="procmap",argv[1]=elpid;argv[2]=NULL;
  1469.             if (execvp(argv[0],argv)==-1)  /*probamos procmap OpenBSD*/
  1470.          perror("cannot execute procmap (OpenBSD)");
  1471.  
  1472.       argv[0]="vmmap"; argv[1]="-interleave"; argv[2]=elpid;argv[3]=NULL;
  1473.       if (execvp(argv[0],argv)==-1) /*probamos vmmap Mac-OS*/
  1474.          perror("cannot execute vmmap (Mac-OS)");
  1475.       exit(1);
  1476.   }
  1477.   waitpid (pid,NULL,0);
  1478. }
  1479.  
  1480.  
  1481. void cmdMemory(){
  1482.     int i,j,k;
  1483.     if(numtrozos==1 || (numtrozos>1 && strcmp(trozos[1],"-all")==0)){
  1484.  
  1485.     printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
  1486.     printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
  1487.     printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
  1488.     printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
  1489.     printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
  1490.     printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  1491.             for(i=0;i<nbloq;i++){
  1492.                 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);
  1493.             }
  1494.             for(i=0;i<nshared;i++){
  1495.                 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);
  1496.             }
  1497.             for(i=0;i<nmmap;i++){
  1498.                 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);
  1499.             }
  1500.  
  1501.     }else{
  1502.     if(strcmp("-blocks",trozos[1])==0){
  1503.         printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  1504.             for(i=0;i<nbloq;i++){
  1505.                 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);
  1506.             }
  1507.             for(i=0;i<nshared;i++){
  1508.                 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);
  1509.             }
  1510.             for(i=0;i<nmmap;i++){
  1511.                 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);
  1512.             }
  1513.         }else if(strcmp("-pmap",trozos[1])==0){
  1514.             Do_pmap();
  1515.         }else if(strcmp("-funcs",trozos[1])==0){
  1516.             printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
  1517.             printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
  1518.         }else if(strcmp("-vars",trozos[1])==0){
  1519.             printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
  1520.             printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
  1521.             printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
  1522.         }
  1523.     }
  1524. }
  1525.  
  1526. //P3
  1527.  
  1528. void MostrarEntorno(char **entorno, char *nombre_entorno){
  1529.     int i = 0;
  1530.     while(entorno[i] != NULL){
  1531.         printf("%p->%s[%d]=(%p) %s\n", &entorno[i], nombre_entorno, i, entorno[i], entorno[i]);
  1532.         i++;
  1533.     }
  1534. }
  1535.  
  1536. int BuscarVariable(char *var, char *e[]){
  1537.     int pos=0;
  1538.     char aux[MaxHist];
  1539.     strcpy(aux, var);
  1540.     strcat(aux, "=");
  1541.     while(e[pos]!=NULL)
  1542.         if(!strncmp(e[pos], aux, strlen(aux)))
  1543.             return pos;
  1544.         else
  1545.             pos++;
  1546.     errno=ENOENT;
  1547.     return(-1);
  1548. }
  1549.  
  1550. int CambiarVariable(char *var, char *valor, char *e[]){
  1551.    
  1552.     int pos;
  1553.     char *aux;
  1554.    
  1555.     if((pos=BuscarVariable(var, e)) == -1)
  1556.         return(-1);
  1557.     if(((aux)=(char *)malloc(strlen(var)+strlen(valor)+2)) == NULL)
  1558.         return -1;
  1559.     strcpy(aux, var);
  1560.     strcat(aux, "=");
  1561.     strcat(aux, valor);
  1562.     e[pos]=aux;
  1563.     return(pos);
  1564. }
  1565.  
  1566. void cmdPriority(){
  1567.     int w, i, j, z, m;
  1568.    
  1569.     if(numtrozos == 1){
  1570.         z = getpid();
  1571.         m = getpriority(0, z);
  1572.         printf("Prioridad del proceso %d es %d\n", z, m);
  1573.     }
  1574.    
  1575.     if(numtrozos == 2){
  1576.         i = atoi(trozos[1]);
  1577.         w = getpriority(0, i);
  1578.         printf("Prioridad del proceso %d es %d\n", i, w);
  1579.     }
  1580.    
  1581.     if(numtrozos == 3){
  1582.         i = atoi(trozos[1]);
  1583.         j = atoi(trozos[2]);
  1584.         setpriority(0, i, j);
  1585.     }
  1586. }
  1587.  
  1588. void cmdEntorno(){
  1589.    
  1590.     if(numtrozos == 1)
  1591.         MostrarEntorno(entorno, "agr3");
  1592.        
  1593.     if(numtrozos == 2 && (strcmp(trozos[1], "-addr") == 0)){
  1594.         printf("entorno: %p (almacenado en %p)\n", entorno, &entorno);
  1595.         printf("main arg3: %p (almacenado en %p)\n", entorno, &entorno);
  1596.     }
  1597.    
  1598.     if(numtrozos == 2 && (strcmp(trozos[1], "-environ") == 0))
  1599.         MostrarEntorno(environ, "environ");
  1600. }
  1601.  
  1602.  
  1603. void cmdCambiarVar(){
  1604.     char aux[1000];
  1605.    
  1606.     if(numtrozos == 4 && (strcmp(trozos[1], "-a") == 0))
  1607.         CambiarVariable(trozos[2], trozos[3], entorno);
  1608.        
  1609.     if(numtrozos == 4 && (strcmp(trozos[1], "-e") == 0))
  1610.         CambiarVariable(trozos[2], trozos[3], environ);
  1611.        
  1612.     if(numtrozos == 4 && (strcmp(trozos[1], "-p") == 0)){
  1613.         strcpy(aux, trozos[2]);
  1614.         strcat(aux, "=");
  1615.         strcat(aux, trozos[3]);
  1616.         CambiarVariable(trozos[2], trozos[3], environ);
  1617.     }
  1618. }
  1619.  
  1620.  
  1621. void cmdMostrarVar(){
  1622.  
  1623.     if(numtrozos == 1)
  1624.         MostrarEntorno(entorno, "arg3");
  1625.     else{
  1626.         int i = BuscarVariable(trozos[1], entorno);
  1627.         int w = BuscarVariable(trozos[1], environ);
  1628.         printf("main arg3: %s %p (almacenado en %p)\n", entorno[i], entorno[i], &entorno[i]);
  1629.         printf("environ:    %s %p (almacenado en %p)\n", entorno[w], entorno[w], &entorno[w]);
  1630.         printf("getenv:         %s %p\n", getenv(trozos[1]), getenv(trozos[1]));
  1631.     }
  1632. }
  1633.  
  1634. void cmdFork ()
  1635. {
  1636.     pid_t pid;
  1637.  
  1638.     if ((pid=fork())==0){
  1639.         HistProcesosBorrar();
  1640.         printf ("ejecutando proceso %d\n", getpid());
  1641.     }
  1642.     else if (pid!=-1)
  1643.         waitpid (pid,NULL,0);
  1644. }
  1645.  
  1646. int ValorSenal(char * sen)  /*devuelve el numero de senial a partir del nombre*/
  1647. {
  1648.   int i;
  1649.   for (i=0; sigstrnum[i].nombre!=NULL; i++)
  1650.     if (!strcmp(sen, sigstrnum[i].nombre))
  1651.         return sigstrnum[i].senal;
  1652.   return -1;
  1653. }
  1654.  
  1655.  
  1656. char *NombreSenal(int sen)  /*devuelve el nombre senal a partir de la senal*/
  1657. {           /* para sitios donde no hay sig2str*/
  1658.  int i;
  1659.   for (i=0; sigstrnum[i].nombre!=NULL; i++)
  1660.     if (sen==sigstrnum[i].senal)
  1661.         return sigstrnum[i].nombre;
  1662.  return ("SIGUNKNOWN");
  1663. }
  1664.  
  1665. void cmdListJobs(){
  1666.     int i;
  1667.     int status;
  1668.     pid_t pid;
  1669.    
  1670.     for(i=0;i<nprocesos;i++){
  1671.         pid=waitpid(HistProcesosElemento(i)->PID,&status,WNOHANG| WUNTRACED| WCONTINUED);
  1672.        
  1673.         if(pid==HistProcesosElemento(i)->PID){
  1674.            
  1675.             if(WIFEXITED(status)){
  1676.                 strcpy(HistProcesosElemento(i)->status,"FINISHED");
  1677.                 HistProcesos[i]->prioridad=-1;
  1678.                 status=WIFEXITED(status);
  1679.             }else if(WIFSIGNALED(status) && (pid!=0 || HistProcesosElemento(i)->senal !=0)){
  1680.             //if(WTERMSIG(status)<=31){
  1681.                 strcpy(HistProcesosElemento(i)->status,"SIGNALED");
  1682.                 HistProcesos[i]->prioridad=-1;
  1683.                 HistProcesosElemento(i)->senal=WTERMSIG(status);
  1684.                 status=WIFSIGNALED(status);
  1685.             //}
  1686.             }else if(WIFSTOPPED(status)){
  1687.                 strcpy(HistProcesosElemento(i)->status,"STOPPED");
  1688.                 HistProcesosElemento(i)->senal=WSTOPSIG(status);
  1689.                 status=WIFSTOPPED(status);
  1690.                 }else if(HistProcesosElemento(i)->senal==0 && pid==0){
  1691.                     strcpy(HistProcesosElemento(i)->status,"ACTIVE");
  1692.         }
  1693.     }
  1694.        
  1695.        
  1696.         if(HistProcesosElemento(i)->senal!=0){
  1697.             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);
  1698.         }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);
  1699.         }
  1700.     }
  1701.    
  1702. void cmdDelJobs(){
  1703.     int flagTERM;
  1704.     int flagSIG;
  1705.     int i,j;
  1706.    
  1707.     if(numtrozos==1){
  1708.         printf("Uso del comando: deljobs [-sig][-term]\n");
  1709.        
  1710.     }else{
  1711.        
  1712.         for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  1713.             if(strcmp(trozos[i],"-term")==0) flagTERM = 1;
  1714.             if(strcmp(trozos[i], "-sig") == 0) flagSIG = 1;
  1715.         }
  1716.         if(flagTERM==1){
  1717.             for(i=0;i<nprocesos;){
  1718.                 if(strcmp(HistProcesosElemento(i)->status,"FINISHED")==0){
  1719.                    
  1720.                    
  1721.                         for(j=i;j<nprocesos-1;j++){
  1722.                             HistProcesos[j]=HistProcesos[j+1];
  1723.                         }
  1724.                         nprocesos--;
  1725.                      
  1726.                     }else{
  1727.                         i++;
  1728.                     }
  1729.                
  1730.                
  1731.                 }
  1732.         }
  1733.        
  1734.         if(flagSIG==1){
  1735.             for(i=0;i<nprocesos;){
  1736.                 if(strcmp(HistProcesosElemento(i)->status,"SIGNALED")==0){
  1737.                    
  1738.                    
  1739.                         for(j=i;j<nprocesos-1;j++){
  1740.                             HistProcesos[j]=HistProcesos[j+1];
  1741.                         }
  1742.                         nprocesos--;
  1743.                      
  1744.                     }else{
  1745.                         i++;
  1746.                     }
  1747.                
  1748.                
  1749.                 }
  1750.            
  1751.         }
  1752.        
  1753.         if(flagTERM==0 && flagSIG==0){
  1754.             printf("Uso del comando: deljobs [-sig][-term]\n");
  1755.         }
  1756.        
  1757.         }
  1758.    
  1759.     }
  1760.    
  1761. void cmdJob(){
  1762.     int i;
  1763.     int flagFG=0;
  1764.     int pidbuscado;
  1765.     int pid;
  1766.     int status;
  1767.    
  1768.     for(i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  1769.             if(strcmp(trozos[i],"-fg")==0) flagFG = 1;
  1770.         }
  1771.    
  1772.     if(numtrozos==1){
  1773.         cmdListJobs();
  1774.        
  1775.     }else if(numtrozos==2 && flagFG==0){
  1776.        
  1777.         pidbuscado=atoi(trozos[1]);
  1778.         for(i=0;i<nprocesos && HistProcesosElemento(i)->PID != pidbuscado;i++);
  1779.         if(i>=nprocesos){
  1780.             printf("No existe ese proceso\n");
  1781.         }else{
  1782.            
  1783.         pid=waitpid(HistProcesosElemento(i)->PID,&status,WNOHANG| WUNTRACED| WCONTINUED);
  1784.        
  1785.         if(pid==HistProcesosElemento(i)->PID){
  1786.            
  1787.             if(WIFEXITED(status)){
  1788.                 strcpy(HistProcesosElemento(i)->status,"FINISHED");
  1789.                 HistProcesos[i]->prioridad=-1;
  1790.                 status=WIFEXITED(status);
  1791.             }else if(WIFSIGNALED(status) && (pid!=0 || HistProcesosElemento(i)->senal !=0)){
  1792.             //if(WTERMSIG(status)<=31){
  1793.                 strcpy(HistProcesosElemento(i)->status,"SIGNALED");
  1794.                 HistProcesos[i]->prioridad=-1;
  1795.                 HistProcesosElemento(i)->senal=WTERMSIG(status);
  1796.                 status=WIFSIGNALED(status);
  1797.             //}
  1798.             }else if(WIFSTOPPED(status)){
  1799.                 strcpy(HistProcesosElemento(i)->status,"STOPPED");
  1800.                 HistProcesosElemento(i)->senal=WSTOPSIG(status);
  1801.                 status=WIFSTOPPED(status);
  1802.                 }else if(HistProcesosElemento(i)->senal==0 && pid==0){
  1803.                     strcpy(HistProcesosElemento(i)->status,"ACTIVE");
  1804.         }
  1805.     }
  1806.        
  1807.        
  1808.         if(HistProcesosElemento(i)->senal!=0){
  1809.             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);
  1810.         }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);
  1811.        
  1812.     }
  1813.        
  1814.        
  1815.        
  1816.            
  1817.     }else if(numtrozos==2 && flagFG==1){
  1818.         printf("Uso del comando: job [-fg] pid\n");
  1819.     }else if(numtrozos>=3){
  1820.        
  1821.         if(flagFG==1){
  1822.             pidbuscado=atoi(trozos[2]);
  1823.             if(waitpid(pidbuscado,&status,0)==-1){
  1824.                 printf("No existe ese proceso\n");
  1825.             }else{
  1826.                     if(WIFEXITED(status)){
  1827.                         printf("El proceso %d se cerró normalmente\n",pidbuscado);
  1828.                         for(i=0;i<nprocesos && HistProcesosElemento(i)->PID != pidbuscado;i++);
  1829.                         if(i<nprocesos){
  1830.                         strcpy(HistProcesosElemento(i)->status,"FINISHED");
  1831.                         }
  1832.                     }
  1833.                    
  1834.                     if(WIFSIGNALED(status)){
  1835.                         printf("El proceso %d se cerró con una señal\n",pidbuscado);
  1836.                         for(i=0;i<nprocesos && HistProcesosElemento(i)->PID != pidbuscado;i++);
  1837.                         if(i<nprocesos){
  1838.                         strcpy(HistProcesosElemento(i)->status,"SIGNALED");
  1839.                         HistProcesosElemento(i)->senal=WTERMSIG(status);
  1840.                         }
  1841.                     }
  1842.                
  1843.             }
  1844.        
  1845.         }else{
  1846.             printf("Uso del comando: job [-fg] pid\n");
  1847.                
  1848.         }
  1849.     }
  1850.    
  1851.    
  1852.    
  1853.    
  1854.    
  1855. }
  1856.  
  1857. const char * Ejecutable(const char* file){
  1858.     if(file[0]!='.'){
  1859.     char destino[20] = "/usr/bin/";
  1860.     char *destinos[] = {destino};
  1861.     strcat(destino,file);
  1862.     return destinos[0];
  1863.     }else return file;
  1864.    
  1865. }
  1866.  
  1867. void OurExecvpe(const char *file, char *const argv[], char *const envp[])
  1868. {
  1869.     if( (execve(Ejecutable(file),argv, envp)==-1) ){
  1870.        perror("Imposible ejecutar: ");
  1871.        };
  1872. }
  1873.  
  1874. void cmdExecute(){
  1875.     int i,j;
  1876.     char* argv[TAMANO];
  1877.     char* envp[TAMANO];
  1878.     char x[TAMANO];
  1879.     char y[TAMANO];
  1880.     char entorno[TAMANO];
  1881.     bool flagEntorno=true;
  1882.     int var,cont=1;
  1883.  
  1884.     strcpy(x,getenv("XAUTHORITY"));
  1885.     strcpy(y,"XAUTHORITY=");
  1886.     strcat(y,x);
  1887.  
  1888.     if(numtrozos==2){
  1889.         envp[0]= (char *)"DISPLAY=:0.0";
  1890.         envp[1]=(char *)y;
  1891.         envp[2]=NULL;
  1892.  
  1893.         argv[0]= trozos[1];
  1894.         argv[1]= NULL;
  1895.     }else{
  1896.         if(!isupper(trozos[1][0])){
  1897.  
  1898.         envp[0]= (char *)"DISPLAY=:0.0";
  1899.         envp[1]=(char *)y;
  1900.         envp[2]=NULL;
  1901.  
  1902.         flagEntorno=false;
  1903.         argv[0]=trozos[1];
  1904.         for(i=2;i<numtrozos && i<20;i++){
  1905.             if(trozos[i][0]!='@'){
  1906.             argv[i-1]=trozos[i];
  1907.               }
  1908.             }
  1909.             argv[i-1]=NULL;
  1910.         }else{
  1911.  
  1912.             for(i=1;i<numtrozos;i++){
  1913.                 for(j=0;j<strlen(trozos[i])-1 && isupper(trozos[i][j]);j++);
  1914.  
  1915.                 if(j+1==strlen(trozos[i])){
  1916.                     strcpy(entorno,trozos[i]);
  1917.                     strcat(entorno,"=");
  1918.  
  1919.                     strcat(entorno,getenv(trozos[i]));
  1920.  
  1921.                     envp[i-1]=malloc(100);
  1922.                     strcpy(envp[i-1],entorno);
  1923.  
  1924.                 }else break;
  1925.             }
  1926.             envp[i-1]=NULL;
  1927.  
  1928.  
  1929.  
  1930.         argv[0]=malloc(100);
  1931.         strcpy(argv[0],trozos[i]);
  1932.  
  1933.  
  1934.         var=i;
  1935.         for(i=i+1;i<numtrozos && i<20;i++){
  1936.             if(trozos[i][0]!='@'){
  1937.             argv[cont]=malloc(100);
  1938.             strcpy(argv[cont],trozos[i]);
  1939.  
  1940.             cont++;
  1941.               }
  1942.             }
  1943.             if(var+1==numtrozos){
  1944.             argv[var-1]=NULL;
  1945.             } else argv[i-2]=NULL;
  1946.  
  1947.  
  1948.  
  1949.  
  1950.             }
  1951.         }
  1952.  
  1953.         for(i = 1; i < numtrozos && trozos[i][0] != '@' ; i++);
  1954.             if(i<numtrozos){
  1955.             if(trozos[i][0] == '@'){
  1956.                 char *prioridad;
  1957.                 int prioridadint;
  1958.                 prioridad = trozos[i] + 1;
  1959.                 prioridadint= atoi(prioridad);
  1960.                 setpriority(PRIO_PROCESS,getpid(),prioridadint); //getpid() o 0
  1961.                 }
  1962.             }
  1963.  
  1964.  
  1965.  
  1966.  
  1967.     if(flagEntorno==false){
  1968.     OurExecvpe(trozos[1],argv,envp);
  1969.     }else {
  1970.         OurExecvpe(argv[0],argv,envp);
  1971.         }
  1972.     for(i=0;i<TAMANO;i++){
  1973.         free(envp[i]);      //Liberar
  1974.         }
  1975.  
  1976. }
  1977.  
  1978.  
  1979. //Comando ayuda
  1980. void cmdAyuda() {
  1981.     if (numtrozos == 1) {
  1982.         printf("'ayuda cmd' donde cmd es uno de los siguientes comandos:\n"
  1983.                "fin salir bye fecha pid autores hist comando carpeta infosis ayuda\n");
  1984.     } else if (numtrozos > 1 && strcmp(trozos[1], "fin") == 0) {
  1985.         printf("fin \tTermina la ejecucion del shell\n");
  1986.     } else if (numtrozos > 1 && strcmp(trozos[1], "salir") == 0) {
  1987.         printf("salir \tTermina la ejecucion del shell\n");
  1988.     } else if (numtrozos > 1 && strcmp(trozos[1], "bye") == 0) {
  1989.         printf("bye \tTermina la ejecucion del shell\n");
  1990.     } else if (numtrozos > 1 && strcmp(trozos[1], "fecha") == 0) {
  1991.         printf("fecha [-d|.h\tMuestra la fecha y o la hora actual\n");
  1992.     } else if (numtrozos > 1 && strcmp(trozos[1], "pid") == 0) {
  1993.         printf("pid [-p]\tMuestra el pid del shell o de su proceso padre\n");
  1994.     }else if (numtrozos > 1 && strcmp(trozos[1], "autores") == 0) {
  1995.         printf("autores [-n|-l]\tMuestra los nombres y logins de los autores\n");
  1996.     }else if (numtrozos > 1 && strcmp(trozos[1], "hist") == 0) {
  1997.         printf("hist [-c|-N]\tMuestra el historico de comandos, con -c lo borra\n");
  1998.     }else if (numtrozos > 1 && strcmp(trozos[1], "comando") == 0) {
  1999.         printf("comando [-N]\tRepite el comando N (del historico)\n");
  2000.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  2001.         printf("carpeta [dir]\tCambia (o muestra) el directorio actual del shell\n");
  2002.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  2003.         printf("infosis \tMuestra informacion de la maquina donde corre el shell\n");
  2004.     }else if (numtrozos > 1 && strcmp(trozos[1], "ayuda") == 0) {
  2005.         printf("ayuda [cmd]\tMuestra ayuda sobre los comandos\n");
  2006.     }else if (numtrozos > 1 && strcmp(trozos[1], "create") == 0) {
  2007.         printf("create [-f] [name]  Crea un directorio o un fichero (-f)\n");
  2008.     }else if (numtrozos > 1 && strcmp(trozos[1], "stat") == 0) {
  2009.         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");
  2010.     }else if (numtrozos > 1 && strcmp(trozos[1], "list") == 0) {
  2011.         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");
  2012.     }else if (numtrozos > 1 && strcmp(trozos[1], "delete") == 0) {
  2013.         printf("delete [name1 name2 ..] Borra ficheros o directorios vacios\n");
  2014.     }else if (numtrozos > 1 && strcmp(trozos[1], "deltree") == 0) {
  2015.         printf("deltree [name1 name2 ..]    Borra ficheros o directorios no vacios recursivamente\n");
  2016.     }
  2017. }
  2018.  
  2019. struct cm_entrada{
  2020.     char *cm_nombre;
  2021.     void (*cm_fun)();
  2022. };
  2023.  
  2024. struct cm_entrada cm_tabla[] = {
  2025.     {"autores", cmdAutores},
  2026.     {"ayuda", cmdAyuda},
  2027.     {"bye", cmdFin},
  2028.     {"carpeta", cmdCarpeta},
  2029.     {"comando", cmdComandoN},
  2030.     {"create", cmdCreate},
  2031.     {"delete", cmdDelete},
  2032.     {"fecha", cmdFecha},
  2033.     {"fin", cmdFin},
  2034.     {"hist", cmdHist},
  2035.     {"infosis", cmdInfosis},
  2036.     {"pid", cmdPid},
  2037.     {"salir", cmdFin},
  2038.     {"stat", cmdStat},
  2039.     {"list", cmdList},
  2040.     {"allocate",cmdAllocate},
  2041.     {"deallocate",cmdDeallocate},
  2042.     {"memdump",cmdMemdump},
  2043.     {"recurse",cmdRecurse},
  2044.     {"memory",cmdMemory},
  2045.     {"memfill",cmdMemfill},
  2046.     {"i-o",cmdIo},
  2047.     {"fork",cmdFork},
  2048.     {"listjobs",cmdListJobs},
  2049.     {"execute",cmdExecute},
  2050.     {"deljobs",cmdDelJobs},
  2051.     {"job",cmdJob},
  2052.     {"priority",cmdPriority},
  2053.     {"showenv",cmdEntorno},
  2054.     {"showvar",cmdMostrarVar},
  2055.     {"changevar",cmdCambiarVar},
  2056.     //Actualizar número en función de abajo (Actual 31)
  2057. };
  2058.  
  2059. void comprobarSiEsta(char *linea){
  2060.     int i,j;
  2061.     int pid;
  2062.     int status;
  2063.     time_t t = time(NULL);
  2064.     struct tm tm = *localtime(&t);
  2065.     uid_t uid = geteuid();
  2066.     struct passwd *pws = getpwuid(uid);
  2067.  
  2068.     char aux[TAMANO], aux2[TAMANO];
  2069.     char *prioridad;
  2070.     int prioridadint;
  2071.    
  2072.  
  2073.     pid=fork();
  2074.    
  2075.  
  2076.     char *copialinea = strdup(linea);
  2077.     numtrozos = TrocearCadena(copialinea, trozos);
  2078.  
  2079.     for(i=0;i<31 && strcmp(cm_tabla[i].cm_nombre, trozos[0]) != 0;i++); //CAMBIAR
  2080.  
  2081.     if(pid==0){
  2082.         if(i<31){ //CAMBIAR
  2083.             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){ ///////////////////////////////////////
  2084.             ejecutarComando(linea);
  2085.         }
  2086.  
  2087.         }else{
  2088.             if(strcmp(trozos[numtrozos-1],"&")!=0){
  2089.             //Programar *****
  2090.             trozos[numtrozos]=malloc(1000); //Hacer free
  2091.  
  2092.             for(i=1;i<numtrozos+1;i++){
  2093.                 if(i==1){
  2094.                     strcpy(aux,trozos[1]);
  2095.  
  2096.  
  2097.                     trozos[1]=malloc(TAMANO);
  2098.                     strcpy(trozos[1],trozos[0]);//AQUÍ
  2099.  
  2100.                     }else{
  2101.                         if(i%2==0){
  2102.                             strcpy(aux2,trozos[i]);
  2103.  
  2104.                             trozos[i]=malloc(TAMANO);
  2105.                             strcpy(trozos[i],aux);
  2106.  
  2107.                             }else{
  2108.                                 strcpy(aux,trozos[i]);
  2109.  
  2110.                                 trozos[i]=malloc(TAMANO);
  2111.                                 strcpy(trozos[i],aux2);
  2112.  
  2113.                                 }
  2114.  
  2115.                         }
  2116.             }numtrozos++; //Aumentar trozos
  2117.  
  2118.             cmdExecute();
  2119.         }else{
  2120.  
  2121.             numtrozos--;
  2122.             //Con &
  2123.             //Programar *****
  2124.             trozos[numtrozos]=malloc(1000); //Hacer free
  2125.  
  2126.             for(i=1;i<numtrozos+1;i++){
  2127.                 if(i==1){
  2128.                     strcpy(aux,trozos[1]);
  2129.  
  2130.  
  2131.                     trozos[1]=malloc(TAMANO);
  2132.                     strcpy(trozos[1],trozos[0]);//AQUÍ
  2133.  
  2134.                     }else{
  2135.                         if(i%2==0){
  2136.                             strcpy(aux2,trozos[i]);
  2137.  
  2138.                             trozos[i]=malloc(TAMANO);
  2139.                             strcpy(trozos[i],aux);
  2140.  
  2141.                             }else{
  2142.                                 strcpy(aux,trozos[i]);
  2143.  
  2144.                                 trozos[i]=malloc(TAMANO);
  2145.                                 strcpy(trozos[i],aux2);
  2146.  
  2147.                                 }
  2148.  
  2149.                         }
  2150.             }numtrozos++; //Aumentar trozos
  2151.  
  2152.             cmdExecute();
  2153.  
  2154.  
  2155.  
  2156.             }
  2157.         exit(0);
  2158.             }
  2159.     }else{
  2160.  
  2161.         if(strcmp(trozos[0],"execute")==0){
  2162.             ejecutarComando(linea);
  2163.             waitpid(-1,&status,0);
  2164.         }
  2165.  
  2166.         if(strcmp(trozos[0],"listjobs")==0){////////////////////////
  2167.             ejecutarComando(linea);
  2168.             waitpid(pid,&status,WNOHANG);
  2169.         }
  2170.        
  2171.         if(strcmp(trozos[0],"deljobs")==0){////////////////////////
  2172.             ejecutarComando(linea);
  2173.             waitpid(pid,&status,WNOHANG);
  2174.         }
  2175.        
  2176.         if(strcmp(trozos[0],"job")==0){////////////////////////
  2177.             ejecutarComando(linea);
  2178.             waitpid(pid,&status,WNOHANG);
  2179.         }
  2180.        
  2181.         if(strcmp(trozos[0],"showenv")==0){////////////////////////
  2182.             ejecutarComando(linea);
  2183.             waitpid(pid,&status,WNOHANG);
  2184.         }
  2185.        
  2186.         if(strcmp(trozos[0],"priority")==0){////////////////////////
  2187.             ejecutarComando(linea);
  2188.             waitpid(pid,&status,WNOHANG);
  2189.         }
  2190.        
  2191.         if(strcmp(trozos[0],"showvar")==0){////////////////////////
  2192.             ejecutarComando(linea);
  2193.             waitpid(pid,&status,WNOHANG);
  2194.         }
  2195.        
  2196.         if(strcmp(trozos[0],"changevar")==0){////////////////////////
  2197.             ejecutarComando(linea);
  2198.             waitpid(pid,&status,WNOHANG);
  2199.         }
  2200.        
  2201.         /*if( (strcmp(trozos[0],"salir")==0 || strcmp(trozos[0],"fin")==0 || strcmp(trozos[0],"bye")==0)){////////////////////////
  2202.             ejecutarComando(linea);
  2203.             waitpid(pid,&status,WNOHANG);
  2204.         }*/
  2205.  
  2206.         if(strcmp(trozos[numtrozos-1],"&")==0){
  2207.             //
  2208.             for(i=0;i<numtrozos && isupper(trozos[i][0]);i++);
  2209.             for(j=0;j<numtrozos && trozos[j][0]!='@';j++);
  2210.             if(j==numtrozos){
  2211.                 histProcesoInsert(pid,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"ACTIVE",0,pws->pw_name, trozos[i],0);
  2212.             }else{
  2213.                 prioridad = trozos[j] + 1;
  2214.                 prioridadint= atoi(prioridad);
  2215.                 histProcesoInsert(pid,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"ACTIVE",0,pws->pw_name, trozos[i],prioridadint);
  2216.             }
  2217.             //
  2218.             //waitpid(pid,&status,WNOHANG);
  2219.         }else{
  2220.             waitpid(-1,&status,0);
  2221.         }
  2222.     }
  2223.  
  2224.  
  2225.     free(copialinea);
  2226.     if(pid==0){
  2227.         exit(0);
  2228.     }
  2229.        
  2230. }
  2231.  
  2232. void ejecutarComando(char *linea){
  2233.     int i;
  2234.  
  2235.  
  2236.     if(numtrozos == 0) {return;}
  2237.     for( i=0; ; i++){
  2238.         if(cm_tabla[i].cm_nombre == NULL){
  2239.             printf("%s: comando no reconocido\n", trozos[0]);
  2240.             break;
  2241.         }
  2242.         if(strcmp(cm_tabla[i].cm_nombre, trozos[0]) == 0){
  2243.             cm_tabla[i].cm_fun();
  2244.             break;
  2245.         }
  2246.     }
  2247. }
  2248.  
  2249.  
  2250. int main(int argc, char *argv[], char *envp[]){
  2251.     while(1){
  2252.         entorno=envp;
  2253.         usleep(15000);
  2254.         printf("@>");       //Prompt
  2255.         if( fgets(linea, 4096, stdin) == NULL ){
  2256.             exit(0);
  2257.         }
  2258.         if(linea[0]!=10){
  2259.         comprobarSiEsta(linea);
  2260.         histInsert(linea);
  2261.         }
  2262.     }
  2263.     for(int i=0; i < nhist; i++){
  2264.         free(Hist[i]);
  2265.     }
  2266.     for(int i=0; i < nbloq; i++){
  2267.         free(histBloqElemento(i)->dir);
  2268.         free(HistBloq[i]);
  2269.     }
  2270.     for(int i=0; i < nshared; i++){
  2271.         free(histSharedElemento(i)->dir);
  2272.         free(HistShared[i]);
  2273.     }
  2274.     for(int i=0; i < nmmap; i++){
  2275.         free(histMmapElemento(i)->dir);
  2276.         free(HistMmap[i]);
  2277.     }
  2278.     HistProcesosBorrar();
  2279.  
  2280.     for(int i=0;i<MaxTrozos;i++){
  2281.                 free (trozos[i]);
  2282.             }
  2283. }
  2284.  
Add Comment
Please, Sign In to add comment