La parte básica de la conexión entre el hardware del ordenador y el programador se encuentra en el
Sistema de Archivos. Es él quien se encarga de darnos acceso a los ficheros del disco, al teclado y a la pantalla en modo texto. La ventaja que tiene esto es que nos abstrae totalmente de las características del hardware, presentándonos todo como una ristra de caracteres.
El acceso a un fichero sigue una serie de pasos absolutamente necesarios: primero es preciso
abrir el archivo, de modo que el programa obtenga control sobre él; una vez hecho esto, podemos realizar cualquier operación de lectura y/o escritura sobre él, y finalizar
cerrando el archivo, de modo que lo liberamos y puede ser accedido por otro programa.
Apertura y cierre de ficheros
La primera operación necesaria antes de poder acceder a un archivo es identificarlo mediante una llamada al Sistema Operativo. A esta operación se le denomina
apertura del archivo. Le enviamos como parámetros el nombre del archivo a abrir y una serie de opciones, y nos devolverá un
identificador de archivo (en adelante se denominará
Handle) que usaremos para referirnos a él cuando queramos leer o escribir. El identificador es simplemente un número entero. Existe una única excepción en este caso: los archivos estandar no es necesario que sean abiertos, pues ya tienen asignado un identificador (
STDIN=0,
STDOUT=1,
STDERR=2).
Las opciones de apertura especifican la forma en que el programa va a acceder a dicho fichero. Por ejemplo, puede querer acceder solo en modo lectura, o bien puede especificar que si dicho fichero no existe, devuelva un error, o bien que lo cree. O bien, si existe, puede pedir que lo sobreescriba. Etc.
El cierre del fichero se hace al final del acceso, cuando ya no vamos a leer o escribir nada más en él. Esto permite su liberación, de modo que cualquier otro programa puede acceder a él con total libertad.
DosOpen
DosClose
Lectura y escritura de datos
Una vez que hemos abierto un fichero, podemos acceder a él. Los ficheros aparecen como un flujo de caracteres en serie, y el caracter actual está referenciado por un puntero que se incrementa automáticamente después de cada operación. Esto significa que cuando hacemos una lectura de un fichero, recibiremos el caracter siguiente al último leido. Y cada vez que escribamos un caracter, lo haremos a continuación del último escrito. Existe sin embargo la posibilidad de cambiar la posición de dicho puntero, de modo que podemos leer y escribir de forma aleatoria. Esta opción, sin embargo, solo funciona con ficheros de disco, y no con dispositivos como el teclado, pantalla, etc.
DosRead
DosWrite
Compartición de ficheros
Dado que OS/2 es un Sistema Operativo multitarea, puede ocurrir que dos (o más) programas intenten acceder a la vez a un mismo fichero de disco. Para evitar interferencias, OS/2 ofrece una serie de opciones de compartición de archivos, que se especifican en el momento de abrirlos. Estas son:
Modos de acceso al fichero
- READ_ONLY: solo se va a leer del fichero.
- WRITE_ONLY: solo se va a escribir en el fichero.
- READ_WRITE: se va a leer y escribir (es el valor por omisión).
Modos de compartición
- DENY_ALL: OS/2 rechaza cualquier petición posterior de abrir ese archivo.
- DENY_READ: OS/2 rechaza cualquier petición de abrir ese archivo para lectura.
- DENY_WRITE: OS/2 rechaza cualquier petición de abrir ese archivo para escritura.
- DENY_NONE: OS/2 permite cualquier operación con ese archivo.
Los modos de compartición permiten elegir la forma en que otros programas acceden al fichero que tenemos abierto. Por ejemplo, si tenemos un programa que lee del fichero
prueba.txt y lo envía a la impresora, lo lógico es que lo abra como READ_ONLY, pues no va a escribir nada en él. Por otro lado, no puede permitir que otro programa modifique el fichero, pero no le importa que pueda leerlo, por lo que como modo de acceso asigna READ_ONLY. De esta forma, si otro programa intenta acceder al mismo fichero, OS/2 solo le dará acceso si intenta acceder en modo READ_ONLY; si intenta abrirlo como WRITE_ONLY o READ_WRITE, OS/2 le devolverá un error.
Gestión de dispositivos
A través del sistema de ficheros podemos acceder también a los dispositivos físicos que forman el ordenador. Existen normalmente una serie de archivos que identifican a cada periférico y que nos permiten enviar y recibir datos hacia y desde ellos.
Los nombres de los archivos de que disponemos son:
- COM1-COM4: maneja los puertos serie del ordenador.
- CLOCK$: el reloj del sistema.
- CON: gestiona la consola (en lectura es el teclado, en escritura, la pantalla).
- SCREEN$: maneja la pantalla.
- KBD$: maneja el teclado.
- LPT1-LPT3: maneja los puertos pararelo (normalmente la impresora).
- NUL: dispositivo nulo. Todo lo que se envíe a él simplemente es ignorado.
- POINTER$: gestiona el dispositivo de puntero (el ratón).
Los dispositivos cuyo nombre acaba en $ no son accesibles directamente por los programas, y es preciso usar funciones específicas para acceder a ellos. Esto da una mayor riqueza y control sobre ellos.
Funciones del DOS
OS/2 ofrece una gran colección de llamadas para gestionar ficheros en el sistema de archivos. Estas llamadas permiten copiar un fichero a otro, renombrarlo, borrarlo, cambiar de directorio, etc.
DosCopy
DosMove
DosDelete
DosForceDelete
DosCreateDir
DosDeleteDir
DosQueryCurrentDir
DosQueryCurrentDisk
DosSetCurrentDir
DosSetDefaultDisk
Busqueda de ficheros
En muchas ocasiones un programa necesita conocer todos los ficheros que coinciden con un patrón determinado. Es el caso, por ejemplo, de querer mostrar una lista de ficheros que acaben en
AL, o que tengan la letra
F en el tercer lugar, etc. Para ello, OS/2 facilita una serie de funciones que permiten realizar ésto. En ellas se debe especificar un nombre de fichero, sabiendo que:
- El símbolo ? sustituye a cualquier caracter situado en esa posicion. Así, la búsqueda de program?.exe devolverá los nombres de los ficheros que empiecen por program, a continuación tengan un caracter cualquiera, y por último, terminen con .exe, como por ejemplo, programa.exe, o programz.exe; pero no devolverá programad.exe ni programa.
- El símbolo * sustituye a cualquier cadena situada desde esa posición en adelante. Así, la búsqueda de prog* devolverá cualquier fichero que empiece por prog, tenga lo que tenga después. Por ejemplo, devolverá programa, progs...
DosFindFirst
DosFindNext
DosFindClose
Redirección de entradas y salidas
Además de estos ficheros de dispositivo, existen también tres 'archivos' especiales: la entrada estandar (
STDIN), la salida estandar (
STDOUT), y la salida de error estandar (
STDERR). Por defecto, STDIN está asociada al teclado, y STDOUT y STDERR a la pantalla; sin embargo, pueden ser
redireccionadas desde la linea de comandos a un fichero o incluso a otro programa por medio de cauces o
Pipes. Por ejemplo, si tenemos un programa UPCASE.EXE que lee de la entrada estandar un caracter, lo convierte en mayusculas y lo escribe en la salida estandar, y hacemos desde la linea de comandos un
C:\>UPCASE.EXE <entrada.txt >salida.txt
no se quedará esperando a que pulsemos una tecla, ni mostrará en pantalla lo que haya convertido. Lo que hará será leer caracteres del fichero
entrada.txt, y todo lo que salga lo escribirá en el fichero
salida.txt. Hemos redireccionado la entrada al fichero
entrada.txt y la salida al fichero
salida.txt. También podemos direccionar la salida de un programa a la entrada de otro programa distinto, con el caracter |. Así, si hiciesemos
C:\>UPCASE.EXE <entrada.txt |MORE.EXE
nos saldría el texto contenido en
entrada.txt por pantalla, y cada vez que se llene ésta, esperará a que pulsemos una tecla. La salida de UPCASE.EXE ha sido tomada como entrada de MORE.EXE.
Para poder hacer ésto en nuestros programas, simplemente necesitamos leer las órdenes a través de la entrada estandar (indicando 0 como handle en
DosRead) y enviar los resultados y errores por la salida estandar y la salida de error estandar (indicando respectivamente 1 y 2 como handle en
DosWrite).
Variables de entorno
Para permitir la colocación de programas en múltiples directorios y simplificar algunas opciones de configuración, OS/2 facilita las
variables de entorno. Se trata de una serie de variables que se definen bien en la línea de comandos, bien en el CONFIG.SYS, por medio de la sentencia
SET. Por ejemplo, la línea
SET mi_variable=C:\OS2UTIL\MIPROGRAMA
asigna a la variable de entorno
mi_variable el valor
C:\OS2UTIL\MIPROGRAMA. De este modo, el usuario puede especificar el directorio en donde estarán diversas partes de un programa, o bien diversas opciones para éste. Por ejemplo, el compilador EMX requiere de algunas variables de este tipo para saber donde están las librerias, documentación, etc. El propio OS/2 hace uso de esta facilidad para implementar variables como el PATH de datos, etc.
DosScanEnv
Otras funciones DOS
Otras funciones pertenecientes a este grupo son las siguientes:
DosResetBuffer
DosShutdown
DosBeep