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.
Por que 'timer_t' é definido apenas na biblioteca padrão do linux c?
Essa situação geralmente acontece? Quero dizer, existem funções ou atributos definidos de maneira diferente entre diferentes sistemas operacionais?
timer_t
nã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.Respostas:
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_t
tipo ou as funções que o utilizam. Aqueles são da extensão POSIX , daqui esta referência no cabeçalho linux: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
.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
.fonte
timer_t
é usado pelas APIs do timer_ no POSIX, comotimer_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).
fonte