c macos posix

¿Por qué sem_init(), sem_getvalue(), sem_destroy() están en desuso en Mac OS X y qué los reemplaza?



macos posix (1)

Me encontré con este problema cuando intentaba portar una biblioteca en la que estaba trabajando para OS X. Busqué por un tiempo sin encontrar una gran respuesta. Cuando encontré la respuesta, me sentí un poco perturbado: la respuesta es efectivamente "si Apple implementara los semáforos sin nombre POSIX, ¿cuántos servicios X compraría?" .

Para resumir los puntos de por qué están en desuso y por qué parte de la funcionalidad no está implementada:

  • El Apéndice 9 de la Especificación UNIX Única establece que no son interfaces obligatorias
  • "El código más portátil" usa semáforos de SYSV
  • La compatibilidad hacia atrás con los semáforos con nombre POSIX, que comparten el tipo sem_t es difícil

En cuanto a qué hacer en su lugar, me fui con semáforos GCD. En cuanto a por qué se prefiere el reemplazo: es la única interfaz de semáforo nativa sin nombre disponible en vanilla OS X. Aparentemente, GCD les ayudó a vender más X Serves. Me temo que no hay una mejor respuesta.

Sin embargo, espero que algún código sea útil. El resultado de todo esto es que efectivamente tiene que implementar su propia interfaz de semáforo portátil:

#ifdef __APPLE__ #include <dispatch/dispatch.h> #else #include <semaphore.h> #endif struct rk_sema { #ifdef __APPLE__ dispatch_semaphore_t sem; #else sem_t sem; #endif }; static inline void rk_sema_init(struct rk_sema *s, uint32_t value) { #ifdef __APPLE__ dispatch_semaphore_t *sem = &s->sem; *sem = dispatch_semaphore_create(value); #else sem_init(&s->sem, 0, value); #endif } static inline void rk_sema_wait(struct rk_sema *s) { #ifdef __APPLE__ dispatch_semaphore_wait(s->sem, DISPATCH_TIME_FOREVER); #else int r; do { r = sem_wait(&s->sem); } while (r == -1 && errno == EINTR); #endif } static inline void rk_sema_post(struct rk_sema *s) { #ifdef __APPLE__ dispatch_semaphore_signal(s->sem); #else sem_post(&s->sem); #endif }

Este era el conjunto mínimo de funcionalidades que me importaba; sus necesidades pueden variar Esperemos que esto sea útil.

Cuando compilo un programa utilizando la función sem_init() POSIX, recibo una advertencia de compilación (error porque normalmente uso -Werror ) que la función ha quedado en desuso cuando compilo en Mac OS X 10.10.1 (Yosemite) con GCC 4.9. 1 o la versión de Clang ( Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn) ) de XCode 6.1.1. Un vistazo rápido a /usr/include/sys/semaphore.h muestra que la función sí tiene una etiqueta __deprecated después de su declaración, al igual que sem_getvalue() y sem_destroy() .

Preguntas:

  1. Dado que no hay indicios de desaprobación en la especificación POSIX, ¿por qué estas tres funciones se consideran desaprobadas en Mac OS X?

  2. Dado que están en desuso, ¿cuál es el reemplazo y por qué se prefiere el reemplazo?

( Primero verifiqué Preguntar a Diferentes ; no hay preguntas etiquetadas c ni preguntas que pregunten sobre las llamadas desaprobadas del sistema, solo programas ) .