mengapa "timer_t" didefinisikan dalam "time.h" di Linux tetapi tidak pada OS X

11

Ketika saya sedang membaca file kode sumber C, saya menemukan deklarasi ini. (Kode sumber ini ditulis untuk program sistem linux. Ini adalah informasi yang sangat penting)

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

static timer_t* _interval_timer;
...

Pada awalnya, saya ingin tahu lebih banyak tentang 'timer_t'. Jadi saya mencari di Google 'time.h' untuk mendapatkan informasi header. Tapi, tidak ada kata-kata tentang 'timer_t', hanya menyebutkan tentang 'time_t'.

Dengan rasa ingin tahu, saya mencari dan membuka 'time.h' c file library standar di komputer 'mac' saya (seperti yang Anda tahu, / usr / termasuk folder store c file library standar.) Tetapi file ini sama dengan yang sudah di-google sebelumnya.

Akhirnya, saya menyalakan os linux saya (ubuntu) menggunakan mesin virtual dan membuka 'time.h' di folder library standar c linux (path folder sama dengan OSX). Seperti yang saya harapkan, file 'time.h' di linux memiliki deklarasi timer_t.

Saya menambahkan baris kode yang menyatakan tipe 'timer_t' di bawah ini.

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

Pertanyaan saya adalah ini.

  1. Mengapa 'timer_t' hanya didefinisikan di linux c library standar?

  2. Apakah situasi ini biasa terjadi? Maksud saya, apakah ada fungsi atau atribut yang didefinisikan secara berbeda di antara OS yang berbeda?

casamia
sumber
Jenis timer_tini tidak "hanya didefinisikan di linux", misalnya pada Windows / Cygwin, juga didefinisikan. Menurut definisi dalam file header (Linux dan Cygwin) tampaknya menjadi tipe standar POSIX. (Selain itu beberapa platform mungkin tidak sesuai dengan standar, saya tidak melihat situasi spesifik yang "biasa terjadi", seperti yang Anda rumuskan.) WRT pertanyaan umum Anda tentang perbedaan dalam perpustakaan bahasa; itu tergantung pada apakah vendor mematuhi standar atau dengan versi apa yang mereka patuhi.
Janis
Berikut referensi dari POSIX: pubs.opengroup.org/onlinepubs/009695399/functions/…
teppic
@MarkPlotnick: Itu jawaban
Lightness Races di Orbit
@LightningRacisinObrit Saya menyesal telah menulis jawaban (sebagian) sebagai komentar. Saya sudah menghapusnya.
Mark Plotnick

Jawaban:

11

Unix dan C memiliki sejarah yang saling terkait, karena keduanya dikembangkan pada waktu yang sama di Bell Labs di New Jersey dan salah satu tujuan utama C adalah mengimplementasikan Unix menggunakan bahasa portabel tingkat tinggi, arsitektur, dan portabel. Namun, tidak ada standarisasi resmi hingga 1983. POSIX , "antarmuka sistem operasi portabel" adalah standar sistem operasi IEEE yang berasal dari zaman "Perang Unix" . Sejak itu telah berkembang dan sekarang menjadi standar yang paling banyak diterapkan. OSX secara resmi memenuhi syarat POSIX, dan linux secara tidak resmi adalah - ada logistik dan biaya yang terkait dengan kepatuhan resmi yang tidak diikuti oleh distro linux.

Sebagian besar dari apa yang POSIX fokuskan adalah elaborasi hal-hal yang bukan merupakan bagian dari ISO C. Time.h, tetapi versi ISO tidak termasuk timer_tjenis atau fungsi apa pun yang menggunakannya. Itu dari ekstensi POSIX , karenanya referensi ini di header linux:

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

Ini __USE_POSIX199309adalah simbol glibc internal yang diatur dalam features.h when _POSIX_C_SOURCE >= 199309L, yang berarti bahwa POSIX.1b harus didukung (lihat halaman fitur_test_macros ). Ini juga didukung dengan _XOPEN_SOURCE >= 600.

apakah ada fungsi atau atribut yang didefinisikan secara berbeda antara OS yang berbeda?

Saya pikir sehubungan dengan C, di antara sistem POSIX, ada upaya untuk menghindarinya, tetapi itu memang terjadi. Ada beberapa ekstensi GNU (misalnya sterror_r()) yang memiliki tanda tangan yang tidak kompatibel dari rekan-rekan POSIX mereka. Mungkin ini terjadi ketika POSIX mengambil ekstensi tetapi memodifikasinya, atau mereka hanya alternatif yang diimpikan oleh GNU - Anda dapat memilih satu atau yang lain dengan menggunakan yang sesuai #define.

goldilocks
sumber
Sangat bagus! Penjelasan yang sangat bagus!
casamia
1
Standar POSIX dan C sebagian tentang memisahkan C dari Unix - keduanya sangat terikat sehingga kadang-kadang tidak jelas apa yang terjadi.
teppic
2

timer_tdigunakan oleh timer_ API di POSIX, seperti timer_create(). Dalam versi UNIX 03 dari POSIX, itu adalah bagian opsional dari POSIX, dan macOS tidak mengimplementasikannya. Linux dan Solaris, dan mungkin beberapa UN * Xes lainnya, melakukannya.

Jadi kode yang Anda lihat mungkin berfungsi di Linux dan Solaris, tetapi tidak akan berfungsi di macOS, kecuali Apple mengimplementasikan timer timers di masa depan. (Mereka adalah bagian dari versi spesifikasi POSIX saat ini, jadi Apple harus melakukannya jika mereka ingin menyesuaikan dengan versi 4, daripada versi 3, dari spesifikasi.)

pengguna392227
sumber