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; }
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; }
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; }