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.
Mengapa 'timer_t' hanya didefinisikan di linux c library standar?
Apakah situasi ini biasa terjadi? Maksud saya, apakah ada fungsi atau atribut yang didefinisikan secara berbeda di antara OS yang berbeda?
timer_t
ini 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.Jawaban:
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_t
jenis atau fungsi apa pun yang menggunakannya. Itu dari ekstensi POSIX , karenanya referensi ini di header linux:Ini
__USE_POSIX199309
adalah 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
.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
.sumber
timer_t
digunakan oleh timer_ API di POSIX, sepertitimer_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.)
sumber