Svoboda | Graniru | BBC Russia | Golosameriki | Facebook

To install click the Add extension button. That's it.

The source code for the WIKI 2 extension is being checked by specialists of the Mozilla Foundation, Google, and Apple. You could also do it yourself at any point in time.

4,5
Kelly Slayton
Congratulations on this excellent venture… what a great idea!
Alexander Grigorievskiy
I use WIKI 2 every day and almost forgot how the original Wikipedia looks like.
Live Statistics
Spanish Articles
Improved in 24 Hours
Added in 24 Hours
What we do. Every page goes through several hundred of perfecting techniques; in live mode. Quite the same Wikipedia. Just better.
.
Leo
Newton
Brights
Milds

De Wikipedia, la enciclopedia libre

ioctl es una llamada de sistema en Unix que permite a una aplicación controlar o comunicarse con un driver de dispositivo, fuera de los usuales read/write de datos. Esta llamada se originó en la versión 7 del AT&T Unix. Su nombre abrevia la frase input/output control.

YouTube Encyclopedic

  • 1/3
    Views:
    65 977
    1 553
    139 099
  • Linux Device Driver , Part 1
  • Windows drivers attack surface[32c3]
  • Formatear USB mediante el Simbolo de Sistema

Transcription

Descripción

Una llamada ioctl toma como parámetros:

  1. un descriptor de archivos abierto
  2. un número de código de requerimiento
  3. también un valor entero, posiblemente sin signo (va al driver), o un puntero a datos (también va al driver y vuelve de él)

El kernel generalmente envía un ioctl directamente al driver, el cual puede interpretar el número de requerimiento y datos en cualquier forma requerida. Los escritores del driver documentan cada número de requerimiento del driver para ese driver particular, y los proveen de constantes en el archivo de cabeceras (*.h)

Algunos sistemas tienen convenciones en su codificación, dentro del número de codificación, el tamaño de los datos a ser transferidos desde o hacia el driver del dispositivo, la dirección de la transferencia de datos y la identidad del driver implementando el requerimiento.

Independientemente de que esa convención se cumpla o no, el kernel y el driver colaboran para entregar un código de error uniforme (señalados por la constante simbólica ENOTTY) a una aplicación que haga un requerimiento al driver que no reconozca.

El nemónico ENOTTY (tradicionalmente asociado con el mensaje textual "Not a typerwriter") viene del hecho de que en los sistemas iniciales que incorporaba una llamada ioctl, solo el dispositivo teletipo (tty) planteaba este error. A través del nemónico simbólico es ajustado por los requerimientos de compatibilidad; algunos sistemas modernos muy útilmente prestan un mensaje más general, como: "Inappropriate device control operation", o la localización del mismo.

TCSETS ejemplifica un ioctl en un puerto serial. Las llamadas de lectura y escritura normales en un puerto serial reciben y envían paquetes de datos. Una llamada ioctl(fd, TCSETS, data), independiente de las llamadas normales I/O, controla varias opciones del controlador, como la manipulación de caracteres especiales, o las señales de salida en el puerto (por ejemplo, la señal DTR).

Ejemplo de uso

Un ejemplo de uso para ioctl es el manejo de los leds del teclado, KDGKLED, KDSKBLED son las macros definidas para poder acceder a los leds que la mayoría de los teclados tienen.

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/kd.h>
#include <time.h>
#include <unistd.h>    /*Encabezado para la función sleep() and close() */ 

int get_state(int fd,int *estado)
{
    if (-1 == ioctl(fd, KDGKBLED, estado)){          
/*Si la función ioctl devuelve -1, hubo un error, que será especificado en la función perror(), si es cero significa que finalizo exitosamente*/
        perror("ioctl");
        close(fd);
        return -1;
    }
   return 0;    
}

void print_caps_lock_state(int estado)
{
    printf("Estado Caps Lock: %s (%d)\n",
           (estado & K_CAPSLOCK) == K_CAPSLOCK ? "on" : "off", estado);
}

int apaga(int fd,int *estado)
{
    get_state(fd,estado);
    if (-1 == ioctl(fd, KDSKBLED, *estado ^ K_CAPSLOCK)){
        perror("ioctl set");
        close(fd);
        return -1;
    }
    return 0;
}

int prende(int fd,int *estado)
{
    if (-1 == ioctl(fd, KDSKBLED, K_CAPSLOCK)){
        perror("ioctl set");
        close(fd);
        return -1;
    }
    get_state(fd,estado);
    return 0;
}

int main()
{
    int fd = open("/dev/tty0", O_NOCTTY);

    if (fd == -1){
        perror("open");
        return -1;
    }

    int estado = 0;  
    prende(fd,&estado);    
    sleep(1);
    apaga(fd,&estado);
    sleep(2);
    prende(fd,&estado);
    sleep(1);
    apaga(fd,&estado);
    close(fd);
    return 0;
}

Enlaces externos

Esta página se editó por última vez el 16 abr 2020 a las 23:18.
Basis of this page is in Wikipedia. Text is available under the CC BY-SA 3.0 Unported License. Non-text media are available under their specified licenses. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc. WIKI 2 is an independent company and has no affiliation with Wikimedia Foundation.