Ejemplo n.º 1
0
int main()
{	Tarea *listap;	//creamos la variable lista.
	listap=NULL;
	char identificador[20];
	char identificador1[4];
	char salto_de_linea[]="\n";
	int sal,z;
	char opcion;
	system("clear");
	asteriscos('*',80,2);
	texto("GESTOR DE TAREAS DE UNA AGENDA",'*',80);
	asteriscos('*',80,2);
	printf("\n\n\x1b[35mIntroduzca su identificador: \x1b[0m");
	scanf(" %s",identificador);
	strcat(identificador,salto_de_linea);
	system("clear");
	sal=0;
	while(sal!=1){		//entramos en el bucle del menu.
	printf("\x1b[35mAgenda:\x1b[0m");
	printf("\n1)\x1b[35m Crear tarea.\x1b[0m");
	printf("\n2)\x1b[35m Ver tarea.\x1b[0m");
	printf("\n3)\x1b[35m Ver lista de tareas.\x1b[0m");
	printf("\n0)\x1b[35m Salir del programa.\x1b[0m");
	printf("\n\n\x1b[35m¿Siguiente operación? \x1b[0m");
	scanf(" %c",&opcion);
	printf("\n");
	switch(opcion)
	{
		case '1':
			z=cargarIdentificador(listap);//obtengo el ultimo identificador de la lista.
			listap=crear_tarea(listap,identificador,z); //llamamos a la funcion crear tarea que nos devuelve la lista actualizada.
			break;
		case '2':
			printf("\x1b[36mIntroduce identificador de tarea: \x1b[0m");
			scanf("%s%*c",identificador1);
			strcat(identificador1, salto_de_linea); 
			ver_tarea(identificador1,identificador); //llamamos a la funcion ver tarea.
			break;
		case '3':
			ver_lista(listap); //llamamos a la funcion de ver lista.
			break;
		case '0':
			sal=sale(listap); //llamamos a la funcion salir que nos devuelve un valor para decidir si salimos del bucle o no.
			break;
		default:
			printf("\033[31mELECCIÓN INCORRECTA,PULSAR 1,2,3 o 0: \x1b[0m \n");
			break;	
	}
}
free(listap);//liberamos el puntero.
system("clear");
return 0;
}
Ejemplo n.º 2
0
int sys_ejecutar ( char* arch, char* args[] ) {
   int i, fd, idx_codigo, idx_dato;
   pcb* nueva_tarea;
   dword funcion;
   char* dato = (char*)alocar (11);
   char* archivo = arch + recuperar_base ();
   char** args1 = (char**) (((int)args) + recuperar_base() );

   char* argu;

   if ( args1 != NULL ) {
      i = 0;
      imprimir ( "Mostrando argumentos:\n" );
      while ( args1[i] != NULL ) {
         argu = (char*) ( ((int)args1[i]) + recuperar_base () );
         imprimir ( "args[%d] = <%s>\n", i, argu );
         i++;
      }

      for (i = 0; i < 12 && archivo [i] != '\0'; i++) {
         dato [i] = archivo [i];
      }
   } else {
      imprimir ( "No se recibieron argumentos en ejecutar\n" );
   }

   imprimir_cadena ( "Abriendo: <" );
   imprimir_cadena ( archivo );
   imprimir_cadena ( " - " );
   imprimir_cadena ( dato );
   imprimir_cadena ( ">\n" );

   fd = abrir ( archivo );
   
   funcion = (dword) sys_alocar ( tarea_actual->archivos [fd].ed.tamanio +
                                  TAMANIO_PILA_USUARIO );


   if ( funcion == NULL ) {
     return -1;
   }
   
   if ( fd == ERROR ) {
      return -1;
   } else {
   
      idx_codigo = siguiente_indice_gdt ();
      
      setear_desc_seg ( SEG_CODIGO, funcion, &_gdt->descriptores[idx_codigo],
                        0xFFFFF );
      //                        tarea_actual->archivos [fd].ed.tamanio );
      
      idx_dato = siguiente_indice_gdt ();
      
      setear_desc_seg ( SEG_DATOS, funcion, &_gdt->descriptores[idx_dato],
                        0xFFFFF );
      //                  tarea_actual->archivos [fd].ed.tamanio +
      //                  TAMANIO_PILA_USUARIO );
      
      leer_archivo (fd, (void*)funcion, tarea_actual->archivos [fd].ed.tamanio);
      
      nueva_tarea = crear_tarea ((handler_tarea)funcion);
       
      //nueva_tarea->dato = archivo;
      //nueva_tarea->dato = arch;
      nueva_tarea->dato = dato;

      nueva_tarea->tarea->eip = 0x00;
      
      nueva_tarea->tarea->cs = 8 * idx_codigo;
      
      nueva_tarea->tarea->ds = 8 * idx_dato;
      nueva_tarea->tarea->es = nueva_tarea->tarea->ds;
      nueva_tarea->tarea->fs = nueva_tarea->tarea->ds;
      nueva_tarea->tarea->gs = nueva_tarea->tarea->ds;
      nueva_tarea->selector_ds = nueva_tarea->tarea->ds >> 3;
      
      /*
      nueva_tarea->tarea->esp = funcion + TAMANIO_PILA_USUARIO + 
                                tarea_actual->archivos [fd].ed.tamanio;
      
      nueva_tarea->tarea->ss = nueva_tarea->tarea->ds;
      nueva_tarea->tarea->ss0 = nueva_tarea->tarea->ds;
      nueva_tarea->tarea->ss1 = nueva_tarea->tarea->ds;
      nueva_tarea->tarea->ss2 = nueva_tarea->tarea->ds;
      */

      /*
      imprimir_cadena ("poniendo en ejecucion a ");
      imprimir_cadena (dato);
      imprimir_cadena ("\n");
      */
      agregar (nueva_tarea);

      //cerrar ( fd );
   }
   return nueva_tarea->pid;
}
Ejemplo n.º 3
0
int main () {
   pcb* aux = NULL;

   //char mensaje_bienvenida[26] = "Bienvenidos al banquete!\0";
   //char subrayado[26] = "~~~~~~~~~~~ ~~ ~~~~~~~~\n\0";

   //int len_msg = longitud_cadena (mensaje_bienvenida);

   lista_ready_inicio = NULL;
   lista_ready_fin = NULL;
   ultima_posicion = _lowMemorySize + 2 * 1024 * 1024;
   //ultima_posicion = 1024 * 1024;
   //ultima_posicion = inicio_memoria;

   setear_siguiente_indice (3);

   setear_interrupciones ();

   // Seteo IDT
   cargar_idt ( _idt, CANT_DESCRIPT * 8 - 1 );

   habilitar_irqs ();

   inicializa_teclado();

   /**
    * Se crea la tarea init y se agrega a la cola de ready
    * Tambien se setea el TR con el selector de su TSS, con lo
    * que al hacer el primer context switch (ir_a_tarea()) quedara
    * asignada init como la "tarea de sistema".
    * nota: por ahora init va a ser la tarea idle
    */
   aux = crear_tarea (init);
   aux->dato = (char*)alocar (5);
   aux->dato = "INIT";
   aux->tipo = PROCESO_SISTEMA;
   agregar (aux);
 
   cargar_tr (aux->selector * 8);

   setear_temporizador ();

   pcb_scheduler = crear_tarea (admin_procesos);
   pcb_scheduler->dato = (char*)alocar (6);
   pcb_scheduler->dato = "ADMIN\0";
   pcb_scheduler->tipo = PROCESO_SISTEMA;
   pcb_scheduler->tarea->eflags = 0x2;

   sti();

   //inicializar_ide();

   inicializar_fdc();

   imprimir ( "Bienvenidos al banquete!\n\n" );

   sys_ejecutar ( "INTERFAZ", NULL );

   while (1);

   return 0;
}