2 atributos de archivo de Linux


Prefacio (incluido el índice)


stat y lstat

Uso del comando stat:
Inserte la descripción de la imagen aquí

/**
 * @author IYATT-yx
 * @brief 获取文件部分属性
 */
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
    
    
    if (argc != 2)
    {
    
    
        printf("请指定一个参数为要查询大小的文件!\n");
        return -1;
    }

    struct stat st;
    int ret = stat(argv[1], &st);
    if (ret == -1)
    {
    
    
        perror("stat");
        return -1;
    }
    printf("%s的大小为%ld\n", argv[1], st.st_size);

    // 文件类型, 1法
    if (S_ISREG(st.st_mode))
    {
    
    
        printf("1@这是一个普通文件\n");
    }
    else if (S_ISDIR(st.st_mode))
    {
    
    
        printf("1@这是一个目录文件\n");
    }
    else if (S_ISLNK(st.st_mode))
    {
    
    
        printf("1@这是一个符号链接文件\n");
    }
    else if (S_ISSOCK(st.st_mode))
    {
    
    
        printf("1@这是一个套接字文件\n");
    }
    else if (S_ISBLK(st.st_mode))
    {
    
    
        printf("1@这是一个块设备文件\n");
    }
    else if (S_ISCHR(st.st_mode))
    {
    
    
        printf("1@这是一个字符设备文件\n");
    }
    else if (S_ISFIFO(st.st_mode))
    {
    
    
        printf("1@这是一个管道文件\n");
    }

    // 文件类型, 2法
    int type = st.st_mode & S_IFMT;
    switch (type)
    {
    
    
        case S_IFREG:
            printf("2@这是一个普通文件\n");
            break;
        case S_IFDIR:
            printf("2@这是一个目录文件\n");
            break;
        case S_IFLNK:
            printf("2@这是一个符号链接文件\n");
            break;
        case S_IFSOCK:
            printf("2@这是一个套接字文件\n");
            break;
        case S_IFBLK:
            printf("2@这是一个块设备文件\n");
            break;
        case S_IFCHR:
            printf("这是一个字符设备文件\n");
            break;
        case S_IFIFO:
            printf("这是一个管道文件\n");
            break;
        default:
            break;
    }
}

El ejemplo anterior con la statfunción, hay similares lstaty la fstatprincipal diferencia está en el uso del archivo de enlace suave stat y lstat cuando la consulta es un archivo de enlace suave, stat penetrará en la consulta para archivar puntos de enlace suave, mientras que lstat puede verificar soft Los atributos del archivo vinculado en sí. El fstat es principalmente la diferencia de parámetro. Tanto stat como lstat se consultan por nombre de archivo, mientras que fstat se consulta por el descriptor de archivo de valor de retorno del archivo abierto. La información específica se puede manconsultar mediante comandos. También debería ser fácil tener en cuenta que, la familia de funciones de estadísticas puede verificar los atributos del archivo y el ls -lcontenido que se muestra casi de la misma manera.

estructura estadística

struct stat
{
    
    
    // 文件的设备编号
    dev_t   st_dev;
    // 节点
    ino_t   st_ino;
    // 文件的类型和存取的权限
    mode_t  st_mode;
    // 链到该文件的硬链接数目
    nlink_t st_nlink;
    // 用户ID
    uid_t   st_uid;
    // 组ID
    gid_t   st_gid;
    // (设备类型)若此文件为设备文件,则为其设备编号
    dev_t   st_rdev;
    // 文件字节数
    off_t   st_size;
    // 块大小 (文件系统的I/O缓冲区大小)
    blksize_t   st_blksize;
    // 块数
    blkcnt_t    st_blocks;
    // 最后一次访问时间
    time_t  st_atime;
    // 最后一次内容修改时间
    time_t  st_mtime;
    // 最后一次属性修改时间
    time_t  st_ctime;
};

st_mode (entero de 16 bits)

  • 0 ~ 2 personas o Otros usuarios
S_IROTH 00004 leer
S_IWOTH 00002 escribir
S_IXOTH 00001 llevado a cabo
S_IRWXO 00007 Enmascarar, filtrar permisos no o

* 3 ~ 5 dígitos pertenecen al grupo de usuarios
S_IRGRP 00040 leer
S_IWGRP 00020 escribir
S_IXGRP 00010 llevado a cabo
S_IRWXG 00070 Enmascarar, filtrar permisos que no sean g

* 6 ~ 8 propietarios de archivos u
S_IRUSR 00400 leer
S_IWUSR 00200 escribir
S_IXUSR 00100 llevado a cabo
S_IRWXU 00700 Enmascarar, filtrar permisos que no sean u

* Tipo de archivo de 12 ~ 15 bits
S_IFSOCK 0140000 Enchufe
S_IFLNK 0120000 Enlace simbólico (enlace suave)
S_IFREG 0100000 Archivo normal
S_IFBLK 0060000 Bloquear dispositivo
S_IFDIR 0040000 Tabla de contenido
S_IFCHR 0020000 Dispositivo de caracteres
S_IFIFO 0010000 tubería
S_IFMT 0170000 Código de inundación, filtrar información de tipo que no sea de archivo




/**
 * @author IYATT-yx
 * @brief 检测文件属性: 存在,读,写,操作
 */
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    
    
    if (argc != 2)
    {
    
    
        printf("请指定一个参数为要查询的文件!\n");
        return -1;
    }

    if (access(argv[1], F_OK) == -1)
    {
    
    
        perror("access");
        return -1;
    }
    else
    {
    
    
        if (access(argv[1], R_OK) == 0)
        {
    
    
            printf("R");
        }
        if (access(argv[1], W_OK) == 0)
        {
    
    
            printf("W");
        }
        if (access(argv[1], X_OK) == 0)
        {
    
    
            printf("X");
        }
        printf("\n");
    }
}




Modificar permisos de archivo: chmodfunción
Modificar propietario o grupo de archivo: chownfunción
Modificar tamaño de archivo: truncatefunción
Cambiar atributos de archivos abiertos: fcntlfunción

Supongo que te gusta

Origin blog.csdn.net/weixin_45579994/article/details/112726701
Recomendado
Clasificación