shell.c

Go to the documentation of this file.
00001 /* tarea.c */
00002 #include "stdarg.h"
00003 #include <sys/types.h>
00004 #include <lib/routix.h>
00005 #include <routix.h>
00006 #include <string.h>
00007 #include <signal.h>
00008 
00009 char msg[50];
00010 
00011 char msg1[50];
00012 char msg2[50];
00013 
00014 char str[]="Shell v 0.0.0.3";
00015 
00016 int j, k;
00017 int pid;
00018 int ntasks = 0;         // Tareas hijas del shell (levantar condición de salida)
00019 int aux;
00020 
00021 void _waiting_childs(int signo);
00022 
00023 void main(int argc, char **argv) 
00024 {
00025         printf("Shell3: Cantidad de argumentos recibidos de init: %d\n", argc);
00026         int bucle;
00027         for (bucle = 0; bucle < argc ; bucle++) 
00028                 printf("Argumento %d: %s\n", bucle, argv[bucle]);
00029         
00030         
00031     puts(str);
00032 
00033     putchar('\n');
00034 
00035         signal(SIGCHLD, _waiting_childs);
00036 
00037     while(1) {
00038 
00039         printf("kernel# ");
00040         gets(msg);
00041 
00042         if ( ! strcmp(msg, "clear") ) {
00043             clrscr();
00044         }
00045         else if ( ! strcmp(msg, "exec") ) {
00046             printf("Ingrese nombre de tarea:");
00047             gets(msg1);
00048                 pid = fork();
00049                 if (pid==-1)
00050                         perror("fork");
00051                 else if (pid==0) {              //Shell HIJO
00052                         if (execve(msg1, NULL, NULL)==-1)
00053                                 perror("No pudo ejecutarse");
00054                         exit(-1);
00055                 }
00056                 ntasks++;
00057         }
00058         else if ( ! strcmp(msg, "echo") ) {
00059             printf("Ingrese texto:");
00060             gets(msg1);
00061             printf("%s\n", msg1);
00062         }
00063         else if ( ! strcmp(msg, "\n") ) {
00064         }
00065         else if ( ! strcmp(msg, "ps") ) {  proc_dump(); }
00066         
00067         else if ( ! strcmp(msg, "ps count") ) {  proc_dump(); }
00068 
00069         else if ( ! strcmp(msg, "timers") ) {  timer_dump(); }
00070 
00071         else if ( ! strcmp(msg, "read") ) {  
00072         
00073           puts("Sector: ");
00074           gets(msg1);
00075 
00076           read_debug(atoi(msg1));
00077         
00078         }
00079 
00080         else if ( ! strcmp(msg, "kill") ) {
00081 
00082           puts("Pid: ");
00083           gets(msg1);
00084       puts("Senal: ");
00085           gets(msg2);
00086           if (kill(atoi(msg1), atoi(msg2))==-1)
00087                 perror("kill");
00088                 
00089         }
00090 
00091         else if ( ! strcmp(msg, "info") ) {
00092             printf("Ingrese el PID: ");
00093             gets(msg2);
00094             if (proc_dump_v(atoi(msg2))==-1)
00095                 perror("proc dump verbose"); 
00096         }
00097 
00098         else if ( ! strcmp(msg, "renice") ) {
00099             printf("Ingrese el PID: ");
00100             gets(msg1);
00101             printf("Ingrese la nueva prioridad: ");
00102             gets(msg2);
00103             if (renice( atoi(msg1), atoi(msg2)) == -1)
00104                         perror("renice");
00105 
00106                 proc_dump();
00107         }
00108         
00109         else if ( ! strcmp(msg, "free mem") ) {  printf("Paginas disponibles: %d\n",free_mem() ) ; }
00110         
00111         else if (! strcmp(msg, "show morecores")) {
00112                 show(1);
00113         }
00114 
00115         else if (! strcmp(msg, "show cache")) {
00116                 show(2);
00117         }
00118 
00119         else if (! strcmp(msg, "show zombies")) {
00120                 show(3);
00121         }
00122 
00123         else if (! strcmp(msg, "test malloc")) {
00124                 show(4);
00125         }
00126 
00127         
00128         else if (! strcmp(msg, "show ntasks")) {
00129                 printf("Cantidad de hijos del shell: %d\n", ntasks);
00130         }
00131 
00132         else if (! strcmp(msg, "clear alloc")) {
00133                 show(5);
00134         }
00135 
00136         else if (! strcmp(msg, "show alloc")) {
00137                 show(6);
00138         }
00139 
00140         else if (! strcmp(msg, "clear signals alloc")) {
00141                 show(7);
00142         }
00143         else if (! strcmp(msg, "show signals alloc")) {
00144                 show(8);
00145         }
00146 
00147         
00148         else if (! strcmp(msg, "setvar")) {
00149             printf("Ingrese el nombre: ");
00150             gets(msg1);
00151             printf("Ingrese el valor: ");
00152             gets(msg2);
00153                 if (setvar(msg1, atoi(msg2))==-1)
00154                         printf("No pueden definirse más variables\n");
00155         }
00156 
00157         else if (! strcmp(msg, "getvar")) {
00158             printf("Ingrese el nombre: ");
00159             gets(msg1);
00160                 j = getvar(msg1);
00161                 if (j==-1)
00162                         printf("%s no definida\n", msg1);
00163                 else printf ("Valor de %s: %d\n", msg1, j);
00164         }
00165 
00166         else printf("comando o nombre de archivo erroneo\n");
00167         // Debo hacerme cargo de los hijos que van terminando
00168         /*
00169         if (ntasks>0) {
00170                 pid = waitpid (0, &aux, WNOHANG);
00171                 if (pid>0) {
00172                         printf("SHELL 2 - Proceso: %d termino con: %d\n", pid, aux );
00173                         ntasks--;
00174                 }
00175                         
00176         }
00177         */
00178   }
00179         
00180 }    
00181 
00182 void _waiting_childs(int signo)
00183 {
00184         pid_t pid = waitpid (0, &aux, WNOHANG);
00185         if (pid>0) {
00186                 printf("SHELL - Recibida SIGCHLD - Proceso %d termino con: %d\n", pid, aux );
00187                 ntasks--;
00188         }
00189         
00190 }

Generated on Sun May 30 18:38:35 2004 for Routix OS by doxygen 1.3.6