La escritura es una de las rutinas más básicas proporcionadas por un kernel de sistema operativo similar a Unix . Escribe datos de un búfer declarado por el usuario en un dispositivo determinado, como un archivo. Esta es la forma principal de generar datos de un programa mediante el uso directo de una llamada al sistema. El destino se identifica mediante un código numérico . Los datos que se van a escribir, por ejemplo, un fragmento de texto, se definen mediante un puntero y un tamaño, dado en número de bytes.
write
por lo tanto, toma tres argumentos:
- El código de archivo ( descriptor de archivo o fd ).
- El puntero a un búfer donde se almacenan los datos ( buf ).
- El número de bytes para escribir desde el búfer ( nbytes ).
Uso de POSIX
La interfaz de llamada de escritura [1] [2] [3] está estandarizada por la especificación POSIX. Los datos se escriben en un archivo llamando a la función de escritura. El prototipo de función es:
ssize_t write ( int fd , const void * buf , size_t nbytes );
Argumento | Descripción |
---|---|
fd | Es el descriptor de archivo que se ha obtenido de la llamada a abrir. Es un valor entero. También se pueden dar los valores 0, 1, 2, para entrada estándar, salida estándar y error estándar, respectivamente. |
buf | Apunta a una matriz de caracteres, con contenido que se escribirá en el archivo al que apunta fd. |
nbytes | Especifica el número de bytes que se escribirán desde la matriz de caracteres en el archivo al que apunta fd. |
En la sintaxis anterior, ssize_t
es un typedef
. Es un tipo de datos firmado definido en stddef.h
. Tenga en cuenta que write()
no devuelve un valor sin firmar; devuelve -1 si se produce un error, por lo que debe devolver un valor con signo.
La función de escritura devuelve el número de bytes escritos con éxito en la matriz, que a veces puede ser menor que los nbytes especificados . Devuelve -1 si se encuentra una condición excepcional, consulte la sección sobre errores a continuación.
Ejemplo de uso
#include #include #include #include #include int main ( int argc , char * argv []) { int fd1 ; char buf [ 128 ]; fd1 = abierto ( argv [ 1 ], O_WRONLY ); if ( fd1 == -1 ) { perror ( argv [ 1 ]); return EXIT_FAILURE ; } / * Ingrese los datos que se escribirán en el archivo * / scanf ( "% 127s" , buf ); escribir ( fd1 , buf , strlen ( buf )); / * fd1 es el descriptor del archivo, buf es la matriz de caracteres utilizada para contener los datos, strlen (buf) informa a la función que el número de bytes igual a la longitud de la cadena en el búfer debe copiarse * / cerrar ( fd1 ); return 0 ; }
Errores encontrados durante la operación
A continuación se enumeran algunos errores [4] [5] que se pueden encontrar durante la escritura en un archivo. Los errores son macros enumerados en errno.h .
Números de error | Error | Significado |
---|---|---|
4 | EINTR | La llamada al sistema fue interrumpida. |
5 | EIO | Errores de bajo nivel, a menudo relacionados con operaciones de lectura / escritura de hardware. |
9 | EBADF | El descriptor de archivo fd no es válido o se está intentando escribir en un archivo abierto en modo 'solo lectura'. |
13 | EACCES | El usuario no tiene los permisos necesarios para escribir en el archivo. |
14 | EFAULT | La dirección especificada en la función es una dirección no válida. |
22 | EINVAL | Los argumentos pasados con la función no son válidos. |
27 | EFBIG | El tamaño del archivo especificado en nbytes es demasiado grande y es mayor que el permitido por el sistema. |
28 | ENOSPC | No hay espacio disponible para escribir en el dispositivo de almacenamiento. |
32 | EPIPE | La tubería está rota o el archivo en el otro extremo de la tubería no está abierto para fines de E / S (la mayoría de los procesos que dan este tipo de error también generan la señal SIGPIPE ). |
Funciones de E / S de nivel superior que llaman a escritura
La llamada al sistema de escritura no es una función ordinaria, a pesar del gran parecido. Por ejemplo, en Linux con la arquitectura x86 , la llamada al sistema usa la instrucción INT 80H, para transferir el control al kernel. [6] La llamada al sistema de escritura y su contraparte read , al ser funciones de bajo nivel, solo son capaces de comprender bytes . La escritura no se puede usar para escribir registros, como clases . Por lo tanto, se requieren funciones de entrada-salida de nivel superior (como printf ). A menudo, se prefiere la interfaz de alto nivel, en comparación con la desordenada interfaz de bajo nivel. Estas funciones llaman a otras funciones internamente, y estas a su vez pueden realizar llamadas a escribir, dando lugar a un ensamblaje de funciones en capas. [7] [8]
Con el uso de este conjunto, las funciones de nivel superior pueden recopilar bytes de datos y luego escribir los datos necesarios en un archivo.
Ver también
Referencias
- ^ http://www.unix.com/man-page/FreeBSD/2/write/ Página del manual para escritura
- ^ https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives I / O Primitives
- ^ http://pubs.opengroup.org/onlinepubs/007904875/functions/write.html
- ^ https://www.gnu.org/s/hello/manual/libc/Error-Codes.html Manual de la biblioteca GNU C
- ^ http://www.ibm.com/developerworks/aix/library/au-errnovariable/ Errores de listado de páginas de IBM
- ^ Programación en lenguaje ensamblador LINUX Por Bob Neveln ISBN 978-0-13-087940-0
- ^ https://www.gnu.org/s/libc/ Biblioteca GNU C
- ^ http://ftp.gnu.org/gnu/glibc/ Descarga de la biblioteca GNU C
enlaces externos
- POSIX escribir
- C_Programming / C_Reference / stdio.h / fwrite en Wikilibros