“timer_t” neden Linux'ta “time.h” içinde tanımlanmış ancak OS X'te tanımlanmamış


11

Bir C kaynak kodu dosyasını okurken, bu bildirimleri buldum. (Bu kaynak kodu linux sistem programı için yazılmıştır. Bu çok önemli bir bilgidir)

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

static timer_t* _interval_timer;
...

İlk başta 'timer_t' hakkında daha fazla bilgi edinmek istedim. Bu yüzden başlık bilgisi almak için 'time.h' yazdım. Ancak, 'timer_t' hakkında herhangi bir kelime yoktu, sadece 'time_t' den bahsediyordu.

Merakla, 'mac' bilgisayarımda 'time.h' c standart kütüphane dosyasını araştırdım ve açtım (bildiğiniz gibi, / usr / include klasör depoları c standart kütüphane dosyaları.) Ama bu dosya önceki googled dosyayla aynıydı.

Son olarak, sanal makineyi kullanarak linux os'umu (ubuntu) açtım ve linux c standart kütüphane klasöründeki 'time.h' dosyasını açtım (klasör yolu OSX ile aynıdır). Beklediğim gibi, linux'daki 'time.h' dosyasının timer_t bildirimi var.

Aşağıda 'timer_t' türünü bildiren kod satırlarını ekledim.

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

Sorum şu.

  1. Neden 'timer_t' yalnızca linux c standart kitaplığında tanımlanır?

  2. Bu durum yaygın mı oluyor? Yani, farklı işletim sistemleri arasında farklı tanımlanmış işlevler veya öznitelikler var mı?


Tür timer_t"yalnızca linux'da tanımlanmış" değildir, örneğin Windows / Cygwin'de de tanımlanmıştır. Başlık dosyalarındaki (Linux ve Cygwin) tanımlara göre, POSIX standart tipi gibi görünüyor. (Bazı platformların standartlara uymayabileceğinin ötesinde, siz formüle ettiğinizde "yaygın olarak meydana gelen" herhangi bir özel durum görmüyorum.) Dil kütüphanelerindeki farklılıklar hakkındaki genel sorunuzu yazın; satıcıların standartlara mı yoksa hangi sürümlere uyduklarına bağlıdır.
Janis

İşte POSIX'ten
teppic

@MarkPlotnick: Bu bir cevap
Orbit'teki Hafiflik Yarışları

@LightningRacisinObrit Yorum olarak (kısmi) bir cevap yazdığım için üzgünüm. Kaldırdım.
Mark Plotnick

Yanıtlar:


11

Unix ve C'nin iç içe geçmişleri vardır, çünkü ikisi de aynı zamanda New Jersey'deki Bell Labs'da geliştirildi ve C'nin temel amaçlarından biri Unix'i mimariden bağımsız, taşınabilir bir dil kullanarak uygulamaktı. Ancak 1983 yılına kadar resmi bir standardizasyon yoktu. POSIX , "taşınabilir işletim sistemi arayüzü", "Unix Savaşları" zamanına dayanan bir IEEE işletim sistemi standardıdır . O zamandan beri evrim geçiriyor ve şu anda en yaygın şekilde uygulanan bu standart. OSX resmi olarak POSIX uyumludur ve linux gayri resmi olarak - linux dağıtımlarının katılmadığı resmi uyumluluk ile ilgili lojistik ve maliyetler vardır.

POSIX'in odaklandığı şeylerin çoğu, ISO C'nin bir parçası olmayan şeylerin ayrıntılandırılmasıdır. Time.h, ancak ISO sürümü, timer_ttürü veya onu kullanan herhangi bir işlevi içermez . Bunlar POSIX uzantısından , bu nedenle linux başlığındaki bu referans:

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

Bu __USE_POSIX199309, features.h _POSIX_C_SOURCE >= 199309Löğesinde ayarlanan ve POSIX.1b'nin destekleneceği anlamına gelen dahili bir glibc simgesidir (bkz. Feature_test_macros manpage). Bu ile de desteklenir _XOPEN_SOURCE >= 600.

farklı işletim sistemleri arasında farklı tanımlanmış işlevler veya öznitelikler var mı?

C ile ilgili olarak, POSIX sistemleri arasında, bundan kaçınmak için bir çaba var, ancak oluyor. sterror_r()POSIX benzerlerinden uyumsuz imzalara sahip bazı GNU uzantıları (ör. ) Vardır . Muhtemelen bu, POSIX uzantıyı aldığında ancak değiştirdiğinde ya da sadece GNU tarafından hayal edilen alternatiflerdir - uygun olanı kullanarak birini veya diğerini seçebilirsiniz #define.


Çok hoş! Ne tür bir açıklama!
casamia

1
POSIX ve C standartları kısmen C'yi Unix'ten ayırmakla ilgiliydi - ikisi o kadar yakından bağlıydı ki bazen neyin nereye gittiğinin net olmadığı anlaşılıyordu.
teppic

2

timer_tPOSIX içindeki timer_ API'ları tarafından kullanılır timer_create(). POSIX'in UNIX 03 sürümünde, bunlar POSIX'in isteğe bağlı bir parçasıdır ve macOS bunu uygulamadı. Linux ve Solaris ve muhtemelen diğer bazı UN * Xes yaptılar.

Dolayısıyla, bakacağınız kod Linux ve Solaris üzerinde çalışabilir, ancak Apple gelecekte zamanlayıcı API'lerini uygulamadığı sürece macOS üzerinde çalışmaz. (POSIX belirtiminin geçerli sürümünün bir parçasıdırlar, bu nedenle Apple, belirtimin sürüm 3 yerine sürüm 4'e uymak istiyorsa bunu yapmak zorunda kalacaktır.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.