En cada ejemplo y discusión con el que me encuentro en el contexto de la programación de sockets BSD, parece que la forma recomendada de configurar un descriptor de archivo en el modo de E / S sin bloqueo es usar la O_NONBLOCK
bandera para fcntl()
, por ejemplo,
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
He estado haciendo programación de red en UNIX durante más de diez años y siempre he usado la FIONBIO ioctl()
llamada para hacer esto:
int opt = 1;
ioctl(fd, FIONBIO, &opt);
Realmente nunca pensé mucho en por qué. Lo acabo de aprender de esa manera.
¿Alguien tiene algún comentario sobre los posibles méritos respectivos de uno u otro? Me imagino que el lugar de la portabilidad difiere un poco, pero no sé en qué medida ioctl_list(2)
no habla de ese aspecto de los ioctl
métodos individuales .
fuente
Como dijo @Sean,
fcntl()
está ampliamente estandarizado y, por lo tanto, está disponible en todas las plataformas. Laioctl()
función es anteriorfcntl()
a Unix, pero no está estandarizada en absoluto. Que hayaioctl()
funcionado para usted en todas las plataformas relevantes para usted es una suerte, pero no está garantizado. En particular, los nombres utilizados para el segundo argumento son arcanos y no confiables en todas las plataformas. De hecho, a menudo son exclusivos del controlador de dispositivo particular al que hace referencia el descriptor de archivo. (Lasioctl()
llamadas utilizadas para un dispositivo de gráficos de mapa de bits que se ejecuta en un ICL Perq con PNX (Perq Unix) de hace veinte años nunca se tradujeron a ningún otro lugar, por ejemplo).fuente
Creo que
fcntl()
es una función POSIX. Dondeioctl()
es una cosa estándar de UNIX. Aquí hay una lista de POSIX io .ioctl()
es algo muy específico del kernel / controlador / sistema operativo, pero estoy seguro de que lo que usa funciona en la mayoría de versiones de Unix. algunas otrasioctl()
cosas solo pueden funcionar en ciertos sistemas operativos o incluso en ciertas revoluciones de su kernel.fuente