por que "timer_t" é definido em "time.h" no Linux, mas não no OS X

11

Enquanto eu estava lendo os arquivos de código-fonte C, encontrei essas declarações. (Este código fonte foi escrito para o programa de sistema Linux. Esta é uma informação muito importante)

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

static timer_t* _interval_timer;
...

No começo, eu queria saber mais sobre o 'timer_t'. Então, pesquisei 'time.h' para obter informações do cabeçalho. Mas não havia palavras sobre 'timer_t', apenas mencionando 'time_t'.

Por curiosidade, procurei e abri o arquivo de biblioteca padrão 'time.h' c no meu computador 'mac' (como você sabe, a pasta / usr / include armazena c arquivos de biblioteca padrão.) Mas esse arquivo era o mesmo do anterior pesquisado no Google.

Finalmente, ativei meu sistema operacional linux (ubuntu) usando a máquina virtual e abro o 'time.h' na pasta da biblioteca padrão do linux c (o caminho da pasta é o mesmo do OSX). Como eu esperava, o arquivo 'time.h' no linux possui uma declaração de timer_t.

Eu adicionei as linhas de código que declaram o tipo 'timer_t' abaixo.

#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;

Minha pergunta é essa.

  1. Por que 'timer_t' é definido apenas na biblioteca padrão do linux c?

  2. Essa situação geralmente acontece? Quero dizer, existem funções ou atributos definidos de maneira diferente entre diferentes sistemas operacionais?

casamia
fonte
O tipo timer_tnão é "apenas definido no linux", por exemplo, no Windows / Cygwin, também é definido. De acordo com as definições nos arquivos de cabeçalho (Linux e Cygwin), parece ser um tipo padrão POSIX. (Além de que algumas plataformas podem não estar em conformidade com os padrões, não vejo nenhuma situação específica que "geralmente aconteça", como você a formulou.) WRT sua pergunta geral sobre diferenças nas bibliotecas de idiomas; depende se os fornecedores cumprem com os padrões ou com quais versões eles cumprem.
Janis
Aqui é uma referência de POSIX: pubs.opengroup.org/onlinepubs/009695399/functions/...
teppic
@ MarkPlotnick: Essa é uma resposta
Lightness Races in Orbit
@LightningRacisinObrit Lamento ter escrito uma resposta (parcial) como comentário. Eu o removi.
precisa saber é o seguinte

Respostas:

11

O Unix e o C têm uma história interligada, pois foram desenvolvidos na mesma época no Bell Labs em Nova Jersey e um dos principais objetivos do C era implementar o Unix usando uma linguagem portátil de alto nível, independente da arquitetura. No entanto, não havia nenhuma padronização oficial até 1983. POSIX , a "interface do sistema operacional portátil" é um padrão de sistema operacional IEEE que remonta à época das "Guerras do Unix" . Ele vem evoluindo desde então e agora é o padrão mais amplamente implementado. O OSX é oficialmente compatível com POSIX e o Linux não é oficialmente - há logística e custos associados à conformidade oficial nas quais as distribuições do Linux não participam.

Muito do que o POSIX focou é na elaboração de coisas que não fazem parte da ISO C. O Time.h é, mas a versão ISO não inclui o timer_ttipo ou as funções que o utilizam. Aqueles são da extensão POSIX , daqui esta referência no cabeçalho linux:

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

O __USE_POSIX199309é um símbolo glibc interno que é definido em features.h quando _POSIX_C_SOURCE >= 199309L, o que significa que o POSIX.1b deve ser suportado (consulte a página de manual feature_test_macros ). Isso também é suportado com _XOPEN_SOURCE >= 600.

existem funções ou atributos definidos de maneira diferente entre diferentes sistemas operacionais?

Eu acho que em relação ao C, entre os sistemas POSIX, há um esforço para evitar isso, mas isso acontece. Existem algumas extensões GNU (por exemplo sterror_r()) que possuem assinaturas incompatíveis de suas contrapartes POSIX. Possivelmente isso acontece quando o POSIX pega a extensão, mas a modifica, ou então são apenas alternativas imaginadas pelo GNU - você pode optar por uma ou outra usando um apropriado #define.

Cachinhos Dourados
fonte
Muito agradável! Que explicação gentil!
casamia
1
Os padrões POSIX e C eram em parte sobre separar C do Unix - os dois estavam tão intimamente ligados que às vezes não ficava claro o que ia aonde.
Teppic
2

timer_té usado pelas APIs do timer_ no POSIX, como timer_create(). Na versão UNIX 03 do POSIX, essas são uma parte opcional do POSIX e o macOS não a implementou. Linux e Solaris, e possivelmente alguns outros UN * Xes, o fizeram.

Portanto, o código que você estava visualizando pode funcionar no Linux e Solaris, mas não no macOS, a menos que a Apple implemente as APIs de timer no futuro. (Eles fazem parte da versão atual da especificação POSIX, portanto, a Apple precisará fazê-lo se desejar estar em conformidade com a versão 4, e não com a versão 3).

user392227
fonte