Detalle de los parámetros y ioctl

  

ioctl

nombre de la función: ioctl

Función: Dispositivo de control I /O

Uso: int ioctl (int manejar, int cmd, [int * argdx, int argcx]); macro

definido Notas include /asm /ioctl.h:

#define _IOC_NRBITS 8 //palabra número de secuencia de bit de campo (número) anchura, 8bits
campo

palabra poco ancho #define _IOC_TYPEBITS 8 //número mágico (tipo), un campo de bits de anchura 8 bits de palabras

#define _IOC_SIZEBITS 14 //tamaño (size), 14bits anchura de bit
palabra

#define _IOC_DIRBITS campo (dirección) 2 //dirección, 2bits

#define _IOC_NRMASK ((1 < < _IOC_NRBITS) -1) //campo de número de secuencia máscara, 0x000000FF

#define _IOC_TYPEMASK ((1 < < _IOC_TYPEBITS) -1) //enmascarar campo número mágico, 0x000000FF

#define _IOC_SIZEMASK ((1 < < _IOC_SIZEBITS) -1) //tamaño del campo de máscara, 0x00003FFF

#define _IOC_DIRMASK ((1 < < _IOC_DIRBITS) -1) //máscara dirección del campo, 0x00000003

#define _IOC_NRSHIFT 0 //secuencia de desplazamiento campo de número en todo el campo, 0

#define _IOC_TYPESHIFT (_IOC_NRSHIFT + _IOC_NRBITS) //desplazamiento del campo de número mágico, 8

#define _IOC_SIZESHIFT (_IOC_TYPESHIFT + _IOC_TYPEBITS) //magnitud de los campos de desplazamiento, el desplazamiento 16

#define _IOC_DIRSHIFT (_IOC_SIZESHIFT + _IOC_SIZEBITS) //dirección del campo, 30

/*

* bits de dirección.

* /

#define _IOC_NONE 0U //ninguna transmisión de datos

#define _IOC_WRITE 1U //escribir datos en el dispositivo, el conductor debe leer los datos desde el espacio de usuario

#define _IOC_READ 2U //leer los datos desde el controlador de dispositivo debe estar escrito con los datos del espacio de usuario

#define _IOC (dir, tipo, nr, tamaño) \\

(((dir) < < _IOC_DIRSHIFT) |  \\

((tipo) < < _IOC_TYPESHIFT) |  \\

((NR) < < _IOC_NRSHIFT) |  \\

((tamaño) < < _IOC_SIZESHIFT))

/*

* se utiliza para crear números

* /

//no número de comando parámetro de configuración

#define _IO (tipo, nr) _IOC (_IOC_NONE, (tipo), (nr), 0)

//configuración desde el controlador lectura del número de comandos de datos

#define _IOR (tipo, nr, tamaño) _IOC (_IOC_READ, (tipo), (nr), sizeof (tamaño))

//para el escribir datos de comandos del conductor

#define _IOW (tipo, nr, tamaño) _IOC (_IOC_WRITE, (tipo), (nr), sizeof (tamaño))

//para bidireccional transmisión

#define _IOWR (tipo, nr, tamaño) _IOC (_IOC_READ | _IOC_WRITE, (tipo), (nr), sizeof (tamaño))

/*

* se utiliza para decodificar los números ioctl ..

* /

//analiza los argumentos de la dirección de datos de mando, es decir, escrita o leída

#define _IOC_DIR (nr) (((nr) > > _IOC_DIRSHIFT) &_IOC_DIRMASK)

//analizar los argumentos de la magia del sistema escriba

_IOC_TYPE #define (NR) (((NR) > > _IOC_TYPESHIFT) &_IOC_TYPEMASK)

//desde un parámetro de comando analizar el número ordinal

#define _IOC_NR (nr) (((nr) > > _IOC_NRSHIFT) &_IOC_NRMASK)

//parámetro de análisis de comando desde el tamaño de los datos de usuario

#define _IOC_SIZE (NR) (((NR) > > _IOC_SIZESHIFT) &_IOC_SIZEMASK)

/* ... y para los conductores de los archivos de sonido /... * /

#define IOC_IN (_IOC_WRITE < < _IOC_DIRSHIFT)

#define IOC_OUT (_IOC_READ < < _IOC_DIRSHIFT)

#define IOC_INOUT ((_IOC_WRITE | _IOC_READ) < < _IOC_DIRSHIFT)

#define IOCSIZE_MASK (_IOC_SIZEMASK < < _IOC_SIZESHIFT)

#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)

Ejemplo de programa:

# include < stdlib.h >

# include < stdio.h >

# include < sys /ioctl.h >

int main (void ) {

stat ..int;

/* uso func 8 para determinar si la unidad predeterminada es extraíble * /

..stat = ioctl (0, 8, 0, 0);

..if (! Stat)

.... printf (" La unidad% c es removible. \\ N ", getdisk () + 'A');

..else

.... printf (" La unidad% c no se puede quitar. \\ n ", getdisk () + 'A');

..return 0;

}

Copyright © Conocimiento de Windows All Rights Reserved