Uso de la función C IOCTL

Uso de la función C IOCTL
Los archivos simples de un sistema basado en Linux se pueden leer o escribir fácilmente utilizando operaciones simples de entrada y salida. Sin embargo, también hay algunos otros tipos complejos de archivos a los que no se puede acceder con la ayuda de funciones simples de entrada y salida. Usamos la función "IOCTL" del lenguaje de programación C para todos estos archivos. Significa "control de entrada/ salida."

En este artículo, intentaremos comprender el propósito de la función "IOCTL" del lenguaje de programación C en profundidad mirando su sintaxis. Luego, hablaremos un poco sobre el tipo de archivo para el cual se usa esta función, y también compartiremos con usted la ubicación donde generalmente residen dichos archivos. Luego, demostraremos un ejemplo que usa la función "IOCTL" del lenguaje de programación C. Finalmente, discutiremos algunos errores asociados con esta función particular.

El propósito de la función IOCTL en C:

Además de los archivos regulares de un sistema, hay algunos archivos de propósito especial, como los archivos del dispositivo. Los archivos del dispositivo son los que se utilizan para interactuar con los diferentes controladores de dispositivos de un sistema. Sin embargo, no puede acceder a estos archivos de dispositivo con la ayuda de llamadas de sistema regulares. Aquí es donde entra en juego la función "ioctl". Esta función ayuda a acceder a estos archivos muy convenientemente. La función "ioctl" del lenguaje de programación C reside dentro del "ioctl.H ”Archivo de encabezado.

La sintaxis general de esta función se adjunta a continuación:

#define "Nombre de IOCTL" _IO (NUM1, NUM2, Tipo de argumento)

Aquí, "Nombre de IOCTL" puede ser reemplazado por cualquier nombre significativo que desee para su función particular. Luego, "_io" se puede dejar como lo es para una función "ioctl" sin parámetros; Sin embargo, también puede reemplazarlo con "_iow", "_ior" y "_iowr" para una función "ioctl" que tiene escritura, lectura y lectura y lectura ambas capacidades. "NUM1" se refiere al número único asignado a nuestra llamada "IOCTL", "NUM2" representa el número único asignado a la función "IOCTL", mientras que el "Tipo de argumento" se refiere a los datos de que esta función particular "IOCTL" es capaz de lidiar con.

¿Dónde residen los archivos del dispositivo en un sistema Linux??

Los archivos del dispositivo generalmente residen dentro del directorio "/dev" de un sistema basado en Linux. Por lo tanto, para acceder a todos esos archivos con la ayuda de la función "IOCTL", debe navegar al directorio "/dev" de su sistema.

Uso de la función IOCTL en C:

Para explicarle en detalle el uso de la función IOCTL en el lenguaje de programación C, hemos utilizado un programa C simple que se muestra en las imágenes a continuación. Tenemos la intención de abrir un archivo de dispositivo específico de nuestro sistema y escribirle un valor aleatorio en este programa. Después de hacer esto, también queremos leer un valor del mismo archivo. Debe mirar el código para que este ejemplo lo comprenda más claramente.

Primero, hemos incluido una larga lista de bibliotecas o archivos de encabezado cuyas funciones se utilizarán en este programa C. Luego, hemos definido las funciones de "leer" y "escribir" utilizando la palabra clave "Definir" para leer y escribir los archivos de dispositivos de nuestro sistema. Después de eso, dentro de nuestra función "Main ()", hemos definido una variable entera llamada "FileDescriptor."Este descriptor de archivo se utilizará para verificar si nuestro archivo de dispositivo se ha abierto de manera efectiva o no. Luego, hemos definido otras dos variables de tipo int32_t llamado "val" y "num."Estas variables tomarán la entrada del usuario en el tiempo de ejecución y mostrarán la salida correspondiente.

Después de eso, hemos imprimido un mensaje para transmitir que nuestro programa está intentando abrir el archivo del dispositivo. Luego, utilizando la función "Abrir", hemos intentado abrir el archivo de dispositivo deseado proporcionando su ruta correcta, i.mi., el directorio "/dev" seguido del nombre del archivo de dispositivo deseado. Después de eso, queríamos verificar si el archivo se abrió correctamente o no. Para hacer eso, necesitamos validar el valor de la variable "Filedescriptor". Supongamos que este valor será menor que "0". En ese caso, se imprimirá un mensaje de error en el terminal que indica que el archivo del dispositivo especificado no podría abrirse debido a algún error, y el programa terminará inmediatamente.

De lo contrario, si el archivo del dispositivo se abre correctamente, se imprimirá un mensaje en el terminal pidiendo al usuario que ingrese el valor que desea escribir en el archivo de dispositivo especificado. Luego, la entrada del usuario dada se guardará en la variable "NUM". Después de eso, se imprimirá un mensaje en el terminal para transmitir que el número aprobado se ha escrito en el archivo del dispositivo especificado, seguido de la función "IOCTL" que realizará esta acción. Luego, queremos leer el valor del mismo archivo para el que hemos imprimido un mensaje en el terminal y luego usar nuevamente la función "IOCTL" para leer el valor de ese archivo en la variable "Val".

Después de eso, hemos impreso el valor de la variable "Val" en el terminal, que es el valor leído del archivo de dispositivo especificado. Luego, publicamos un mensaje en el terminal para transmitir el cierre del archivo del dispositivo. Este mensaje es seguido por la función "Cerrar" utilizada para modificar el valor de la variable "Filedescriptor" para que el archivo del dispositivo en discusión se pueda cerrar de manera segura. Finalmente, hemos utilizado la declaración "return 0" como la última declaración de nuestro programa C.

Ahora, es hora de compilar este programa C para ver cualquier error. Para eso, hemos usado el comando fijo:

$ GCC IOCTL.c -o ioctl

Para ejecutar este código C compilado, hemos utilizado el comando que se muestra a continuación:

ps ./IOCTL

Una vez que ejecutamos este script C, se nos pidió ingresar el valor que queríamos enviar al archivo del dispositivo. Hemos ingresado el número "3" como se muestra en la siguiente imagen:

Tan pronto como proporcionamos este valor en la terminal, se escribió inmediatamente en nuestro archivo de dispositivo. Se leyó un nuevo valor de ese archivo y se mostró en el terminal, como se muestra en la imagen a continuación. También puede ver los mensajes sucesivos impresos en el terminal como la salida de este programa C.

Errores comunes aliados con la función IOCTL en C:

Los tres errores más comunes asociados con la función "IOCTL" son los siguientes:

  • Ebadf: El descriptor del archivo no es válido.
  • Efault: Negado el acceso a la memoria no válida.
  • Einval: La solicitud no es válida.

Conclusión:

Este artículo giró en torno a discutir la función "IOCTL" del lenguaje de programación C. Decimos el propósito detallado de esta función y el tipo de archivo con el que esta función generalmente trata. Luego, compartimos un ejemplo exhaustivo para demostrar el uso de esta función, seguido de algunos errores asociados con esta función. Con suerte, después de pasar por esta guía, comprenderá el funcionamiento de la función "IOCTL" del lenguaje de programación C bien.