Comprensión profunda de la función fcntl: control de archivos en la programación del sistema Linux

descripción general

Resumen: La función fcntl es una función importante en la programación del sistema Linux y se utiliza para realizar diversas operaciones de control en descriptores de archivos. Este artículo presentará en detalle el prototipo de la función fcntl, el uso de cada parámetro y el método para cambiar entre los modos de bloqueo y no bloqueo, y proporcionará ejemplos de código correspondientes para ayudar a los lectores a comprender y aplicar mejor la función fcntl.

introducir

La función fcntl es una función de control de archivos en la programación del sistema Linux, que se utiliza para realizar diversas operaciones en descriptores de archivos, como bloqueo de archivos, configuración de estado de descriptores de archivos, etc. Su prototipo es el siguiente:

Prototipo de función y parámetros

#include <fcntl.h>
int fcntl(int fd, int cmd, ...);

La función fcntl acepta tres parámetros: el descriptor de archivo fd, el comando de control cmd y un tercer parámetro opcional arg.

Uso de parámetros

Descriptor de archivo fd: el descriptor de archivo que debe controlarse.

Comando de control cmd: determina la operación específica. Los comandos comunes son:

F_GETFL: obtiene el indicador de estado del descriptor de archivo.
F_SETFL: establece el indicador de estado del descriptor de archivo.
F_GETFD: obtiene el indicador de ejecución del archivo del descriptor de archivo.
F_SETFD: establece el indicador de ejecución del archivo del descriptor de archivo.
F_SETLK: establece el bloqueo de archivos.
F_GETLK: obtiene el estado de bloqueo del archivo.
Tercer argumento opcional arg: argumentos adicionales para algunos comandos de control, según el valor de cmd.

Expansión: fcntl cambia los atributos del archivo

fcntl se utiliza para cambiar el atributo de control de acceso de un archivo [ya abierto]
Centrarse en el uso de dos parámetros, F_GETFL, F_SETFL


	int fcntl(int fd, int cmd, ...)

El comando cmd del descriptor de archivo fd
determina el número de parámetros posteriores

int flgs = fcntl(fd,  F_GETFL);

flgs |= O_NONBLOCK

fcntl(fd,  F_SETFL, flgs);

获取文件状态: F_GETFL

设置文件状态: F_SETFL

Los archivos de terminal están bloqueados para lectura de forma predeterminada, aquí use fcntl para cambiarlo a sin bloqueo para lectura

1.#include <unistd.h>  
2.#include <fcntl.h>  
3.#include <errno.h>  
4.#include <stdio.h>  
5.#include <stdlib.h>  
6.#include <string.h>  
7.  
8.#define MSG_TRY "try again\n"  
9.  
10.int main(void)  
11.{
    
      
12.    char buf[10];  
13.    int flags, n;  
14.  
15.    flags = fcntl(STDIN_FILENO, F_GETFL); //获取stdin属性信息  
16.    if(flags == -1){
    
      
17.        perror("fcntl error");  
18.        exit(1);  
19.    }  
20.    flags |= O_NONBLOCK;  
21.    int ret = fcntl(STDIN_FILENO, F_SETFL, flags);  
22.    if(ret == -1){
    
      
23.        perror("fcntl error");  
24.        exit(1);  
25.    }  
26.  
27.tryagain:  
28.    n = read(STDIN_FILENO, buf, 10);  
29.    if(n < 0){
    
      
30.        if(errno != EAGAIN){
    
              
31.            perror("read /dev/tty");  
32.            exit(1);  
33.        }  
34.        sleep(3);  
35.        write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));  
36.        goto tryagain;  
37.    }  
38.    write(STDOUT_FILENO, buf, n);  
39.  
40.    return 0;  
41.}  

Compile y ejecute, el resultado es el siguiente:
inserte la descripción de la imagen aquí

Como puede ver, es una lectura sin bloqueo.

Resumir

Al presentar en detalle el prototipo de la función fcntl, el uso de parámetros y el método para cambiar entre los modos de bloqueo y no bloqueo, esperamos que los lectores puedan comprender y aplicar mejor la función fcntl.

Supongo que te gusta

Origin blog.csdn.net/qq_46017342/article/details/132545557
Recomendado
Clasificación