PDF de programación - La implementación de smallsh

Imágen de pdf La implementación de smallsh

La implementación de smallshgráfica de visualizaciones

Publicado el 10 de Febrero del 2017
863 visualizaciones desde el 10 de Febrero del 2017
82,4 KB
20 paginas
Creado hace 16a (20/12/2007)
La implementación de smallsh

20 de diciembre de 2007

Índice

1.

Introducción

2. Funciones a implementar en la práctica

2.1. userfn.h . . . . .
2.2. userfn.c . . . . .
2.3. procline.c . . . .
2.4.
. . . .

runcom.c

. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .

. . . .
. . . .
. . . .
. . . .

. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .

. . .
. . .
. . .
. . .

3. Ficheros adicionales
smallsh.h . . . .
3.1.
. . . .
smallsh.c
3.2.
shell.l
.
. . . . .
3.3.
3.4. gettok.h . . . . .
3.5. gettok.c . . . . .
3.6. buffer.h . . . . .
3.7. buffer.c
. . . . .
3.8. Makefile . . . . .

1.

Introducción

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .

1

1
1
3
4
6

7
7
8
9
9
11
16
17
19

Este documento describe el shell smallsh que se debe modificar para las prácticas de Sistemas Operativos.
Este shell es capaz de leer líneas de entrada desde el teclado o desde un fichero y reconocer tanto las órdenes como
los caracteres especiales (tuberías, redirección, etc.). Además, es capaz de ejecutar líneas de comandos sencillas
(órdenes con sus argumentos) separadas por “;” o por “&”. En este último caso, las órdenes se ejecutarán en
segundo plano.

Desde el punto de vista de la implementación, el shell se puede ver dividido en dos partes:

una que implementa la lectura y el reconocimiento de la línea de órdenes y la ejecución de órdenes sencillas
(ya implementada).

otra que el alumno tendrá que modificar o completar.

Por lo general, los ficheros de la primera parte (listados en la sección 3) no necesitan ser modificados por parte

del alumno, aunque éste puede decidir modificarlos según su criterio.

A continuación se exponen comentados los ficheros de los que consta smallsh. Se listan todos por comple-

titud.

1

2. Funciones a implementar en la práctica

El código ya implementado del shell necesita que el alumno implemente una serie de funciones. Las defini-

ciones de esas funciones se pueden encontrar en el fichero userfn.h.

2.1. userfn.h

#ifndef USERFN H
#define USERFN H

enum
{

FLECHA ARRIBA,
FLECHA ABAJO

};

/**
* user inicializar
*
* El shell llama a esta función al principio para que se realicen
* las acciones de inicialización necesarias.
*/
void user inicializar(void);

/**
* user finalizar
*
* El shell llama a esta función al final para que se realicen
* las acciones de finalización necesarias.
*/
void user finalizar(void);

/**
* user getPrompt
*
* Devuelve una cadena con el prompt a mostrar. La cadena la debe reservar
* esta función con malloc.
*
* @return cadena de prompt
*/
char * user getPrompt(void);

/**
* user flecha
*
* Devuelve la cadena que se debe mostrar en la línea de órdenes al pulsar
* la flecha arriba o la flecha abajo.
*
* @param direccion indica si es flecha arriba o flecha abajo
* @param patron patrón a buscar en la historia (anterior o posterior, según
*
*
* @return cadena a poner en la línea de órdenes
*/
char * user flecha(int direccion, char* patron);

el valor de “dirección”

/**
* user nueva orden
*
* Esta función es llamada cada vez que el usuario pulsa INTRO, e informa
* de la orden que ha escrito el usuario. Esta función debe copiar la cadena
* y no modificar la cadena que se le pasa.
*

2

5

10

15

20

25

30

35

40

45

50

55

* @param orden La orden que ha escrito el usuario
*
*/
void user nueva orden(char * orden);

/**
* user tabulador
*
* Devuelve (si procede) la cadena a añadir al pulsar el tabulador. La
* función recibe en “número” si el tabulador se ha pulsado para una orden
* (un 1) o si se ha pulsado para un argumento (un 2). El argumento “numtab”
* especifica el número de veces que se ha pulsado el tabulador (1 ó 2).
* En la primera pulsación la función completar"s si sólo hay una opción. Si
* no, emitir"s un pitido. En la segunda pulsación, si hay varias posibilidades,
* se listar"sn todas ellas.
*
* @param parte parte de la cadena a la que se aplica el tabulador
* @param numero número del argumento: 1->orden, 2->argumento
* @param numtab número de veces que se ha pulsado el tabulador (1 ó 2)
*
* @return Parte restante de la cadena completada o NULL si no se puede
*
*/
char * user tabulador(char * parte, int numero, int numtab);

completar

#endif

/* $Id: userfn.h 1399 2007-12-20 09:45:07Z pedroe $ */

He aquí la explicación de las funciones:

60

65

70

75

80

85

void user_inicializar(void). Esta función es llamada por el shell al inicio para que el alumno
implemente las funciones de inicialización necesarias (por ejemplo, la inicialización de la historia de ór-
denes, etc.).

void user_finalizar(void). Equivalente a la anterior, esta función es llamada por el shell cuando
éste va a terminar su ejecución. Esta función es útil para el alumno para implementar cualquier proceso de
terminación de su implementación (por ejemplo, guardar la historia de órdenes).

char * user_getPrompt(void). Retorna una cadena con el prompt que mostrará el shell. Esta
función debe reservar memoria para la cadena retornada utilizando malloc().

char * user_flecha(int direccion, char * patron). Retorna la cadena con la línea de
órdenes que se mostrará tras que el usuario haya pulsado la tecla indicada por direccion (que puede ser
FLECHA_ARRIBA ó FLECHA_ABAJO, como se ve en el listado anterior). La variable patron guarda el
patrón a buscar en la historia. El alumno es el encargado de manejar la historia de órdenes y de devolver
la cadena adecuada. De nuevo, esta función debe reservar la memoria para la cadena retornada utilizando
malloc().

void user_nueva_orden(char * orden). Esta función es llamada cada vez que el usuario pul-
sa <ENTER>. La cadena orden guarda la orden que ha escrito el usuario. Esta función no puede modi-
ficar el contenido de orden.

char * user_tabulador(char * parte, int numero, int numtab). Retorna la parte
faltante que se completará a partir de la cadena parte, ya que el usuario ha pulsado la tecla <TAB>. El
parámetro numero especifica si el argumento parte se refiere a una orden o un argumento. El parámetro
numtab, que puede ser 1 ó 2. Cuando numtab valga 1, esta función debe emitir un pitido si hay más de
una posibilidad a la hora de completar. Si es un 2, debe mostrar una lista de las posibilidades si hay más de
una. En todos los casos en los que haya más de una posibilidad, la función retornará NULL. En cualquier
otro caso (es decir, cuando se pueda completar de una única forma la parte dada), la función retornará

3

la cadena faltante a partir de la parte dada como argumento (de nuevo, la cadena retornada se tiene que
reservar con malloc()).

2.2. userfn.c

Este fichero contiene implementaciones vacías de esas funciones.

#include "smallsh.h"

void
user inicializar(void)
{

/* Vacío */

}

void
user finalizar(void)
{

/* Vacío */

}

char *
user getPrompt(void)
{

/* Implementación */
return NULL;

}

char *
user flecha(int direccion, char* patron)
{

/* Implementación */
return NULL;

}

void
user nueva orden(char * orden)
{

/* Implementación */

}

char *
user tabulador(char * parte, int numero, int numtab)
{

/* Implementación */
return NULL;

}

/* $Id: userfn.c 1399 2007-12-20 09:45:07Z pedroe $ */

2.3. procline.c

Este fichero lee la estructura TokBuf y construye una línea de comandos a ejecutar. En la implementación
dada esta función sólo es capaz de ejecutar líneas sencillas y órdenes en segundo plano. El alumno tendrá que
implementar todo lo especificado en la práctica.

#include "smallsh.h"

/* El siguiente procedimiento procesa una línea de entrada. La ejecución
* termina cuando se encuentra un final de línea (’\n’). El car"scter ’;’
* sirve para separar unas órdenes de otras y el car"scter ’&’ permite
* una orden en background.

4

5

10

15

20

25

30

35

40

5

10

15

20

25

30

35

40

45

*/
void
procline(struct TokBuf * tb) {

char * arg[MAXARG + 1];
TokType toktype;
int narg;
int where;
int ntoken;

/* Número de argmentos leidos para la orden. */
/* ¿ El proceso se ejecutar"s en primer o segundo plano ?.*/
/* Tokens procesados */

/* Array de palabras: orden + argumentos. */

/* Tipo de token. */

narg = 0;
for (ntoken = 0; ntoken < tb−>length; ntoken++) {

switch(toktype = tb−>tokens[ntoken].type) {

case ARG:

/* Se ha leido un argumento. */

if (narg < MAXARG)

arg[narg++] = tb−>tokens[ntoken].data;

break;

case EOL:
case SEMICOLON:
case AMPERSAND:

case ARROBA:
case AND:
case OR:

where = (toktype == AMPERSAND) ? BACKGROUND :

FOREGROUND;

if (narg != 0) {

arg[narg] = NULL;
runcommand(arg, where);

}
/* Seguir con la siguiente orden. Esto se da
* si se han introducido varias órdenes
* separadas por ’;’ o ’&’. */
narg = 0;
break;

default:

; /* Ignorar */

}

}

}

/* $Id: procline.c 1399 2007-12-20 09:45:07Z pedroe $ */

Para entender cómo realiza su labor procline(), y cómo está construida la estructura TokBuf, a continua-

ción se muestra su definición (se puede ver en el fichero gettok.h, página 9):

struct Token
{

TokType
char

type;
* data;

/* Tipo del token */
/* Texto del token */

};

struct TokBuf
{

int
struct Token * tokens;

length;

/* Longitud del array de tokens */
/* Array de tokens */

};

Como se ve, TokBuf guarda un array de tokens. Un token es un grupo de caracteres que tiene importancia
para el shell, como por ejem
  • Links de descarga
http://lwp-l.com/pdf2394

Comentarios de: La implementación de smallsh (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad