archivos detallados de lectura y escritura y código de ejemplo en Linux | incrustado pieza desarrollo de aplicaciones Linux --01

1. Linux en "todo es un archivo"

En el sistema Linux, todo es un archivo, el tipo de archivo basado en la importancia que representa, se divide en:

  • trivial File
  • archivo de dispositivo: Representa un dispositivo de hardware específico
  • archivos de tuberías, ficheros FIFO: el archivo tiene un significado especial para la comunicación entre procesos;
  • El archivo de socket: una red;

Todos estos archivos se pueden utilizar para operar un conjunto de API, es la de cuatro básica:

  • Abierto: abierta
  • archivo de lectura: leer
  • archivos de escritura: escribir
  • Cerrar: cerrar

Al utilizar estas API manipular archivos, necesita el archivo entrante identificador fd (descriptor de archivo), la naturaleza del código es el identificador de archivo entero de un archivo en un proceso específico, se asigna de forma única al utilizar la función de apertura para abrir un archivo, generalmente, si el valor de fd se asigna a 0, si fd es negativo, indica una operación falla o abrir el archivo falla.

Tenga en cuenta que el fd valor se asigna únicamente cuando el archivo se abre por procedimiento abierto, se reciclará cuando se utiliza cerrar cerrar el archivo. Por ejemplo, como la primera vez que se abre un valor de expediente asignado fd = 0, si el archivo está cerrado, la próxima vez que se abre un nuevo archivo, FD está siendo cero, pero si el archivo no se ha abierto antes del cierre, entonces la próxima cuando los tiempos abrir un nuevo archivo, fd se incrementa a 1, mientras que hasta incrementos de hasta un máximo establecido por el sistema para abrir el archivo, este máximo se puede usar ulimit -na la vista, por lo general 1,024.

Además, el valor de descriptores de archivo 0, 1, ocupado por el sistema, dijo en el sistema Linux de escritorio:

  • fd = 0: la entrada estándar (stdin), correspondiente al teclado del sistema
  • fd = 1: denota una salida estándar de visualización (stdout), correspondiente al sistema de
  • fd = 2: representa la salida de la pantalla de error estándar (stderr), correspondiente al sistema de

En el sistema Linux embebido, en general no hay pantalla y el teclado, puerto serie son interactivos, de manera que un valor correspondiente a tres dispositivos de la siguiente manera:

  • fd = 0: indica la entrada estándar consola serie (stdin), correspondiente al sistema de
  • fd = 1: indica la salida estándar consola serie (stdout), correspondiente al sistema de
  • fd = 2: representa la consola serie salida de error estándar (stderr), correspondiente al sistema de

2. biblioteca de C de Linux proporciona una API de operación de archivo

2.1 cabeceras

Cuando se utiliza la API de operación de archivo, debe contener en primer lugar los siguientes encabezados:

#include <sys/types.h>		//定义了一些常用数据类型,比如size_t
#include <fcntl.h>			//定义了open、creat等函数,以及表示文件权限的宏定义
#include <unistd.h>			//定义了read、write、close、lseek等函数
#include <errno.h>			//与全局变量errno相关的定义
#include <sys/ioctl.h>		//定义了ioctl函数 

2.2 abierta -. Abrir el archivo

Debe estar abierto antes de que el archivo de la operación, obtener el descriptor de fichero fd, el prototipo de la función es la siguiente:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags,mode_t mode);

① parámetros son los siguientes:

  • nombre de ruta: nombre de archivo + Ruta de archivos
  • banderas: Archivo Abrir
  • Modo: Abra los permisos de archivo
  • Valor devuelto int: devuelve un descriptor de archivo se abre correctamente, -1 si falla al abrir y establezca la variable global errno para indicar la causa del error;

② valor banderas banderas se pueden utilizar en <fcntl.h>las definiciones de macros:

  • O_RDONLY: De sólo lectura
  • O_WRONLY: Sólo escritura
  • O_RDWR: De lectura y escritura (común)
  • O_CREAT: Si desea abrir el archivo no existe, crear un nuevo archivo
  • O_EXCL: O_CREAT Si se utiliza un archivo ya existe, se devuelve un mensaje de error
  • O_TRUNC: Si el archivo ya existe, y con éxito abierto, todo el archivo de datos original se elimina
  • O_APPEND: Después de abrir el archivo en modo de escritura de datos anexados, abra el puntero del archivo al final del archivo

La abertura puede utilizar |operador, se usan juntos, tales como:

O_RDWR | O_CREAT

el modo Valor ③ indica los permisos establecidos cuando se crea un nuevo archivo, con los números octales para representar, puede utilizar macros <fcntl.h> definido para representar, pero el número octal es conveniente.

3BIT número octal correspondiente a los tres permisos en el archivo de Linux:

rwxrwxrwx

Los primeros rwx son los permisos del propietario del archivo, archivo de los segundos permisos de grupo de usuario rwx pertenece a la tercera permisos rwx a otros grupos de usuarios;

Cada rwx corresponde a un octal número , tales como 0x7 dice rwx tres plena autoridad allí, 0x0 que significa tres permisos rwx y no hay, por ejemplo:

  • 0700: Su usuario tiene permisos rwx, grupos de usuarios y otros usuarios del grupo de usuario actual no tiene autoridad;
  • 0664(Común): el usuario tiene permisos rw- (- indica que no hay correspondencia de los privilegios), otro grupo de usuario actual tiene permiso rw-, los usuarios de otros grupos de usuarios único permiso r-.

. 2.3 de lectura - leer el archivo

prototipo de la función es la siguiente:

ssize_t read(int fd, void *buf, size_t count);

parámetros de la función son los siguientes:

  • FD: descriptor de archivo
  • buf: para la recepción de los datos del búfer de lectura
  • count: número de bytes leídos solicitud
  • Valor de retorno: una lectura exitosa del número de bytes leídos se devuelve al final del archivo es lectura devuelve 0, -1 si falla a leer, y establecer la variable global errno para indicar la causa del error;

2.4 escritura -. Para escribir archivos

prototipo de la función es la siguiente:

ssize_t write(int fd, const void *buf, size_t count);

parámetros de la función son los siguientes:

  • FD: descriptor de archivo
  • buf: amortiguar el almacenamiento de datos a escribir
  • cuenta: el número de bytes solicitó ser escrita
  • Valor de retorno: Número de bytes realmente escrito está escrito con éxito se devuelve, la escritura falla se devuelve -1, y establecer la variable global errno para indicar la causa del error;

2.5 cerca -. Cierre el archivo

prototipo API es el siguiente:

int close(int fd);

parámetros de la función se comprometieron a cerrar el archivo descriptor de fichero fd.

Si cierra el exitoso regreso 0, en caso contrario devuelve -1 y asigna a la variable global errno informó razones específicas para el error.

3. Los archivos de programa Ejemplo de operación

Ejemplos de funciones:

Abrir el archivo en el directorio actual text.txt, si no existe para crear, escribir una primera cadena y cierre el archivo y vuelva a abrir leer el contenido del archivo y de impresión.

Código de ejemplo:

/**
 * @brief  文件读写API使用示例程序
 * @author Mculover666
 * @note   首先写入文件,接着读取文件
*/

#include <sys/types.h>		//定义了一些常用数据类型,比如size_t
#include <fcntl.h>			//定义了open、creat等函数,以及表示文件权限的宏定义
#include <unistd.h>			//定义了read、write、close、lseek等函数
#include <errno.h>			//与全局变量errno相关的定义
#include <sys/ioctl.h>		//定义了ioctl函数 
#include <stdio.h>

int main(void)
{
    int fd = -1;
    int res = 0;

    char filename[]  = "test.txt";
    char write_dat[] = "Hello World!";
    char read_buf[128] = {0};

    /* 写入文件操作示例 */
    //1. 打开文件
    fd = open(filename, O_RDWR | O_CREAT, 0664);
    if(fd < 0)
    {
        printf("%s file open fail,errno = %d.\r\n", filename, errno);
        return -1;
    }

    //2. 读取内容
    res = write(fd, write_dat, sizeof(write_dat));
    if(res < 0)
    {
        printf("write dat fail,errno = %d.\r\n", errno);
        return -1;
    }
    else
    {
        printf("write %d bytes:%s\r\n", res, write_dat);
    }

    //3. 关闭文件
    close(fd);

    /* 读取文件数据示例 */
    //1. 打开文件
    fd = open(filename, O_RDONLY);
    if(fd < 0)
    {
        printf("%s file open fail,errno = %d.\r\n", filename, errno);
        return -1;
    }

    //2. 写入内容
    res = read(fd, read_buf, sizeof(read_buf));
    if(res < 0)
    {
        printf("read dat fail,errno = %d.\r\n", errno);
        return -1;
    }
    else
    {
        printf("read %d bytes:%s\r\n", res, read_buf);
    }

    //3. 关闭文件
    close(fd);

    return 0;
}

recopilar:

gcc 01-file_test.c -o 01-file_test.o

ejecutar:

4. portado a prueba placa de desarrollo de Linux embebido

4.1 Optimizer - fsync

sistemas embebidos Linux normalmente utilizan memoria flash, write () Hay un problema - después de la presentación de los datos en el búfer interno del sistema se devuelve, por lo que cuando regrese, sistema embebido si un apagón repentino, los datos se escriben en el archivo fallará .

Por lo tanto, al utilizar estas API en sistemas embebidos, que debería ser después de la función de escritura, utilizando la función de fsync () es el archivo de datos modificados inmediatamente por escrito a la memoria flash para evitar la pérdida de datos .

función fsync () en la función prototipo en <unistd.h>, prototipo es el siguiente:

int fsync(int fd);

fsync () después de la llamada, después de todo, será hasta que el archivo se ha modificado datos se escriben en los retornos de disco, devuelve 0 en caso de éxito, el fracaso de retorno -1 y asigna a la variable global errno informaron las razones específicas para el error.

Añadir un código después de la operación de escritura del programa de ejemplo:

//写入之后立马同步数据
res = fsync(fd);
if(res < 0)
{
    printf("fsync fail,errno = %d.\r\n", errno);
    return -1;
}

4.2 portado a funcionar a la placa de desarrollo

① utilizar herramientas de compilación cruzada volver a compilar el programa:

arm-none-linux-gnueabi-gcc 01-file_test.c -o 01-file_test_arm.o

② NFS el sistema de archivos, los archivos ejecutables a bordo de desarrollo

cp 01-file_test_arm.o /nfs_root/

③ placa de desarrollo para ejecutar el programa de prueba:

./01-file_test_arm.o

Los resultados de la tarjeta de desarrollo de la siguiente manera:

la recepción de artículos y recursos de manera más emocionantes empujan, dan la bienvenida a suscribirse a mi canal de micro-número público: "mculover666."

Publicados 259 artículos originales · ganado elogios 661 · vistas 290 000 +

Supongo que te gusta

Origin blog.csdn.net/Mculover666/article/details/104817798
Recomendado
Clasificación