2011-09-03 8 views
6

Estoy desarrollando un modelo de E/S de controlador de dispositivo para pequeñas aplicaciones de microcontrolador, usando POSIX como guía para el diseño de interfaz. He implementado ioctl() como medio de control de los parámetros del controlador/hardware - por ejemplo, la tasa de transmisión UART, I2C dirección del esclavo, etc.Reemplazo de la función ioctl()

Me he dado cuenta, que POSIX: 2008 listas ioctl() y <stropts.h> como obsoleta. ¿Cuál es el mecanismo alternativo recomendado para comunicarse con un controlador de dispositivo?

Respuesta

8

POSIX solo define un subconjunto muy limitado de la funcionalidad ioctl() - relacionado con STREAMS. Dado que la instalación de STREAMS es obsoleta, la interfaz para ella también es obsoleta en POSIX.

Sin embargo, ioctl() ha sido parte de Unix desde 'forever' (ciertamente fue en la 7ma edición de UNIX, y estoy bastante seguro de que no era nuevo incluso entonces). Es 'la forma' de controlar los controladores de dispositivos después de que estén abiertos. El único problema es que tales interfaces y controles no están estandarizados.

Puede echar un vistazo a los archivos <termios.h> para un conjunto de funciones escritas en los terminales de control. Espero que la implementación típica use ioctl() u otros mecanismos especializados similares, pero la interfaz se hizo general cuando estaba estandarizada (la interfaz <termios.h> no es idéntica a ninguna interfaz anterior, ya sea la 7ma Edición o el Sistema III o cualquier otra). Si lo desea, podría escribir funciones estándar encima de su interfaz ioctl() que sus usuarios utilizarían; implementaría esas funciones para llamar a su interfaz ioctl().

Por lo tanto, ioctl() no va a desaparecer; es la forma correcta de controlar los controladores de dispositivos. POSIX tiene una agenda ligeramente diferente, eso es todo.

+4

Para ampliar esto, la eliminación progresiva de 'ioctl' de POSIX no indica que' ioctl' no deba utilizarse, sino que POSIX no está interesado en especificar cómo deberían funcionar los dispositivos de hardware. Como 'ioctl' también se usó con STREAMS, POSIX especificó previamente * solo ese aspecto * de' ioctl' (no cualquier otro uso con dispositivos), pero ahora que STREAMS es obsoleto, no queda nada por especificar. –

+0

Gracias, sí, eso es exactamente lo que quise decir. –

+3

ioctl() se remonta ... personalmente lo usé en la década de 1980. Mientras que los manuales System V de 1983 todavía tengo describen ioctl(), la suciedad real sobre cómo usarlo se encontró en archivos .h y manuales técnicos. Le insto a que ponga todos los detalles sobre SUS ioctls en el archivo .h para el dispositivo como una forma de asegurarse de que esté siempre disponible para los desarrolladores. – Gilbert