porque é que “timer_t” é definido em “time.h” no Linux, mas não no OS X

8

Enquanto lia os arquivos de código-fonte do C, encontrei essas declarações. (Este código fonte foi escrito para o programa do 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 eu pesquisei 'time.h' para obter informações de cabeçalho. Mas não havia palavras sobre 'timer_t', apenas mencionando 'time_t'.

Na curiosidade, eu procurei e abri o arquivo de biblioteca padrão 'time.h' c no meu computador 'mac' (como você sabe, / usr / include armazena arquivos de biblioteca padrão c). Mas esse arquivo era o mesmo com o anterior pesquisei um.

Por fim, eu liguei meu sistema operacional Linux (ubuntu) usando a máquina virtual e opendi o 'time.h' na pasta de biblioteca padrão do linux c (o caminho da pasta é o mesmo que o OSX). Como eu esperava, o arquivo 'time.h' no linux tem 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 o 'timer_t' é definido apenas na biblioteca padrão do linux c?

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

por casamia 05.04.2015 / 14:06

1 resposta

10
O Unix e o C têm uma história entrelaçada, já que ambos foram desenvolvidos na mesma época no Bell Labs em Nova Jersey e um dos principais propósitos do C era implementar o Unix usando uma linguagem portátil, independente de arquitetura e de alto nível. No entanto, não houve nenhuma padronização oficial até 1983. POSIX , a "interface do sistema operacional portátil" é um sistema operacional IEEE padrão que remonta ao tempo das "Unix Wars" . 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 com a conformidade oficial das quais as distribuições Linux não participam.

Muito do que o POSIX tem focado é a elaboração de coisas que não fazem parte da ISO C. O Time.h é, mas a versão ISO não inclui o tipo timer_t ou quaisquer funções que o utilizam. Estes são da extensão POSIX , portanto esta referência no cabeçalho do linux:

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

O __USE_POSIX199309 é um símbolo glibc interno que é configurado em features.h quando _POSIX_C_SOURCE >= 199309L , significando que POSIX.1b deve ser suportado (veja o feature_test_macros manpage). Isso também é suportado com _XOPEN_SOURCE >= 600 .

are there any differently defined functions or attributes between different OS?

Eu acho que no que diz respeito 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 POSIX pega a extensão mas a modifica, ou então são apenas alternativas sonhadas pelo GNU - você pode optar por uma ou outra usando um #define apropriado.

    
por 05.04.2015 / 17:13

Tags