¿Por qué se define "timer_t" en "time.h" en Linux pero no en OS X


11

Mientras leía los archivos de código fuente C, encontré estas declaraciones. (Este código fuente fue escrito para el programa del sistema Linux. Esta es información muy importante)

#include <time.h>
#include <stdio.h>

static timer_t* _interval_timer;
...

Al principio, quería saber más sobre el 'timer_t'. Así que busqué en Google 'time.h' para obtener información del encabezado. Pero, no había palabras sobre 'timer_t', solo mencionaba sobre 'time_t'.

Como curiosidad, busqué y abrí 'time.h' c archivo de biblioteca estándar en mi computadora 'mac' (como saben, / usr / include folder almacena c archivos de biblioteca estándar). Pero este archivo era el mismo que el anterior en google.

Finalmente, encendí mi sistema operativo Linux (ubuntu) usando una máquina virtual y abrí el 'time.h' en la carpeta de la biblioteca estándar de Linux c (la ruta de la carpeta es la misma que OSX). Como esperaba, el archivo 'time.h' en Linux tiene una declaración de timer_t.

Agregué las líneas de código que declaran el tipo 'timer_t' a continuación.

#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309) || defined __need_timer_t)
# define __timer_t_defined      1

# include <bits/types.h>

/* Timer ID returned by `timer_create'.  */
typedef __timer_t timer_t;

Mi pregunta es esta

  1. ¿Por qué 'timer_t' solo se define en la biblioteca estándar de Linux c?

  2. ¿Esta situación ocurre comúnmente? Quiero decir, ¿hay funciones o atributos definidos de manera diferente entre diferentes sistemas operativos?


El tipo timer_tno está "solo definido en Linux", por ejemplo, en Windows / Cygwin también está definido. Según las definiciones en los archivos de encabezado (Linux y Cygwin) parece ser un tipo estándar POSIX. (Además de que algunas plataformas pueden no ajustarse a los estándares, no veo ninguna situación específica que "ocurra comúnmente", como la formuló). Escriba su pregunta general sobre las diferencias en las bibliotecas de idiomas; depende de si los proveedores cumplen con los estándares o con qué versiones cumplen.
Janis


@ MarkPlotnick: Esa es una respuesta
carreras ligeras en órbita el

@LightningRacisinObrit Lamento haber escrito una respuesta (parcial) como comentario. Lo he quitado
Mark Plotnick

Respuestas:


11

Unix y C tienen una historia entrelazada, ya que ambos se desarrollaron casi al mismo tiempo en Bell Labs en Nueva Jersey y uno de los principales propósitos de C fue implementar Unix usando un lenguaje portátil de alto nivel, independiente de la arquitectura. Sin embargo, no hubo ninguna estandarización oficial hasta 1983. POSIX , la "interfaz del sistema operativo portátil" es un estándar del sistema operativo IEEE que se remonta a la época de las "Guerras Unix" . Ha evolucionado desde entonces y ahora es el estándar más ampliamente implementado. OSX es oficialmente compatible con POSIX y Linux no es oficialmente: hay logística y costos asociados con el cumplimiento oficial que las distribuciones de Linux no participan.

Gran parte de lo que POSIX se ha centrado es en la elaboración de cosas que no forman parte de ISO C. Time.h sí, pero la versión ISO no incluye el timer_ttipo ni las funciones que lo utilizan. Esos son de la extensión POSIX , de ahí esta referencia en el encabezado de Linux:

#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309)

El __USE_POSIX199309es un símbolo interno de glibc que se establece en features.h cuando _POSIX_C_SOURCE >= 199309L, lo que significa que POSIX.1b debe ser compatible (consulte la página de manual feature_test_macros ). Esto también es compatible con _XOPEN_SOURCE >= 600.

¿hay funciones o atributos definidos de manera diferente entre diferentes sistemas operativos?

Creo que con respecto a C, entre los sistemas POSIX, hay un esfuerzo para evitar eso, pero sucede. Hay algunas extensiones GNU (por ejemplo sterror_r()) que tienen firmas incompatibles de sus contrapartes POSIX. Posiblemente esto sucede cuando POSIX toma la extensión pero la modifica, o de lo contrario son solo alternativas soñadas por GNU: puede optar por una u otra utilizando una adecuada #define.


¡Muy agradable! ¡Qué amable explicación!
casamia

1
Los estándares POSIX y C se debían en parte a separar C de Unix: los dos estaban tan estrechamente vinculados que a veces no estaba claro qué fue a dónde.
teppic

2

timer_tes utilizado por las API de timer_ en POSIX, como timer_create(). En la versión UNIX 03 de POSIX, esos son una parte opcional de POSIX, y macOS no lo implementó. Linux y Solaris, y posiblemente otros UN * Xes, lo hicieron.

Por lo tanto, el código que estaba viendo podría funcionar en Linux y Solaris, pero no en macOS, a menos que Apple implemente las API del temporizador en el futuro. (Forman parte de la versión actual de la especificación POSIX, por lo que Apple tendrá que hacerlo si desean cumplir con la versión 4, en lugar de la versión 3, de la especificación).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.