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.
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.
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.
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:
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:
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.
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:
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).
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
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.
Otras funciones pertenecientes a este grupo son las siguientes: