Operación de archivo IO basada en el sistema Linux

Este artículo describe brevemente las funciones básicas de Linux file io. File IO también se llama llamada al sistema IO. Es un conjunto de interfaces proporcionadas por el sistema operativo para la interacción entre los procesos que se ejecutan en "modo de usuario" y el hardware. El kernel del sistema operativo está reservado para los programas del usuario. Según la estructura del sistema operativo, el sistema Linux se divide de arriba a abajo: proceso de usuario, kernel de Linux y hardware físico. El kernel de Linux incluye dos partes, la interfaz de llamada al sistema y el subsistema del kernel. El kernel de Linux ocupa una posición clave al "conectar el pasado y el futuro", administrar el hardware físico hacia abajo y proporcionar interfaces para el sistema operativo y las aplicaciones hacia arriba. Las interfaces aquí son llamadas al sistema.

A continuación se presentan las funciones generales de apertura, lectura, escritura, búsqueda y cierre de archivos.

abierto

        archivo principal 

#incluir <sys/stat.h>
#incluir <fcntl.h>

        función

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
        función
         para abrir el archivo y obtener el
        descriptor
de archivo para operar el archivo Parámetros         nombre de ruta: la cadena correspondiente al archivo ruta a abrir
        Banderas
de primera dirección             O_RDONLY de solo
            lectura O_WRONLY de solo escritura
            O_RDWR lectura-escritura

        Solo se puede especificar una de las tres constantes anteriores (las siguientes constantes están conectadas mediante | (u operación))
            El archivo O_CREAT no existe para crear (requiere abrir para pasar el tercer parámetro)
            El archivo O_TRUNC existe y está truncado a 0 (borrado a 0)
            O_APPEND agregado para abrir
            O_ASYNC IO asíncrono
            O_NONBLOCK IO sin bloqueo
            O_EXCL Detecta si el archivo existe       
        Valor de retorno
        Devuelve con éxito un nuevo descriptor de archivo
        Devolución fallida -1 

cerca

archivo principal

#incluir <unistd.h>

función

int close(int fd);
función
cierra los
parámetros del descriptor de archivo valor de retorno
del descriptor de archivo  éxito retorno 0  fracaso retorno -1 


escribir

archivo principal

#incluir <unistd.h>

función

ssize_t write(int fd, const void *buf, size_t count);
Función
Escribe el conteo de bytes de datos que comienzan con buf en el archivo correspondiente al descriptor de archivo
Parámetros
fd: descriptor de archivo
buf: almacena la primera dirección del espacio de datos
conteo: escribe
Valor de retorno del número de bytes ingresados.
Si se realiza correctamente, devuelve el número real de bytes escritos.
Si falla, se devuelve -1.  

leer

archivo principal

#incluir <unistd.h>

Función
ssize_t read(int fd, void *buf, size_t count);
Función
Leer el conteo de bytes del descriptor del archivo y colocarlos en el espacio señalado por buf
Parámetros
fd: descriptor de archivo  buf: almacenar la primera dirección del conteo
del espacio de datos  : El valor de retorno
del número máximo de bytes de datos leídos . Si tiene éxito, devolverá el número real de bytes leídos. Si falla, devolverá -1 y  devolverá 0 cuando lea el final del archivo. 



Ahora uso las cuatro interfaces de funciones presentadas anteriormente para implementar una copia de un archivo. 

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char const *argv[])
{
          int fd_src = 0;
          int fd_dst = 0;
          char tmpbuff[1024] = {0};
          ssize_t nret = 0;
          fd_src = open("src.jpg",O_RDONLY);//打开文件只读
          fd_dst = open("dst.jpg",O_WRONLY | O_TRUNC | O_CREAT,0664);/*打开文件读写、截断为0、如果文件不存在则创建    mode(110 110 100)*/
          if(-1 == fd_dst || -1 == fd_src)
          {
                    perror("fail to open");
                    return -1;
          } 
          while (1)
          {
                    nret = read(fd_src, tmpbuff, sizeof(tmpbuff));//读到多少返回到nret
                    if(0 >= nret)//如果nret不大于0则说明读到末尾
                    {
                              break;
                    }
                    write(fd_dst,tmpbuff,nret);//上面nret为多少就写多少
                   
          }
          close(fd_src);
          close(fd_dst);//关闭两文件

          return 0;
}

 

 

buscar

archivo principal

#incluir <unistd.h>

función

off_t lseek(int fd, off_t offset, int de dónde);
Función
Reubicar
el parámetro
de desplazamiento del descriptor de archivo fd:
desplazamiento del descriptor de archivo: desplazamiento
        >0 desplazamiento hacia atrás
        <0 desplazamiento hacia adelante
de dónde:
        archivo SEEK_SET SEEK_CUR al principio
        del archivo en la posición actual
        SEEK_END al final del archivo
Valor de retorno
Devuelve con éxito el desplazamiento,
el error devuelve -1 

 Lo siguiente es utilizar la función lseek para operar en el archivo.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
    int fd = 0;
    off_t len = 0;

    fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
    if (-1 == fd)
    {
        perror("fail to open");
        return -1;
    }

    len = lseek(fd, 10, SEEK_SET);//定位文件开头向后偏移10
    printf("偏移量:%ld\n", len);
    write(fd, "a", 1);

    len = lseek(fd, -5, SEEK_CUR);//定位文件当前向前偏移5
    printf("偏移量:%ld\n", len);
    write(fd, "b", 1);

    len = lseek(fd, 0, SEEK_SET);//定位文件开头无偏移
    printf("偏移量:%ld\n", len);
    write(fd, "c", 1);

    close(fd);

    return 0;
}

Se puede ver que el desplazamiento de 10 se coloca inicialmente en 10, y después de insertar una A, el desplazamiento es 11. Después de desplazar 5 desde la posición actual hacia la izquierda, el desplazamiento impreso es 6 y finalmente se desplaza desde el principio a 0. , por lo que el desplazamiento es Shift es 0.

El resultado de la inserción interna después de abrir el archivo creado se muestra en la figura (la parte roja no tiene caracteres y no es un espacio\0\n, por lo que no se puede mostrar normalmente) 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_58193842/article/details/128538790
Recomendado
Clasificación