เหตุใดจึงกำหนด“ timer_t” ใน“ time.h” บน Linux แต่ไม่ใช่ OS X


11

ขณะที่ฉันอ่านไฟล์ซอร์สโค้ด C ฉันพบการประกาศนี้ (ซอร์สโค้ดนี้เขียนขึ้นสำหรับโปรแกรมระบบ linux นี่เป็นข้อมูลที่สำคัญมาก)

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

static timer_t* _interval_timer;
...

ตอนแรกฉันอยากรู้เพิ่มเติมเกี่ยวกับ 'timer_t' ดังนั้นฉันจึง googled 'time.h' เพื่อรับข้อมูลส่วนหัว แต่ไม่มีคำใด ๆ เกี่ยวกับ 'timer_t' เพียง แต่พูดถึง 'time_t' เท่านั้น

ในความอยากรู้ฉันค้นหาและเปิดไฟล์ไลบรารี 'time.h' c มาตรฐานในคอมพิวเตอร์ 'mac' ของฉัน (ดังที่คุณทราบ / usr / include โฟลเดอร์เก็บไฟล์ไลบรารีมาตรฐาน c) แต่ไฟล์นี้เป็นไฟล์เดียวกับ googled ก่อนหน้านี้

ในที่สุดฉันก็เปิดระบบปฏิบัติการ linux ของฉัน (Ubuntu) โดยใช้เครื่องเสมือนและเปิด 'time.h' ในโฟลเดอร์ไลบรารีมาตรฐานของ linux c (เส้นทางของโฟลเดอร์เหมือนกับ OSX) อย่างที่ฉันคาดไว้ไฟล์ 'time.h' ใน linux จะมีการประกาศของ timer_t

ฉันเพิ่มบรรทัดโค้ดที่ประกาศประเภท 'timer_t' ด้านล่าง

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

คำถามของฉันคือสิ่งนี้

  1. ทำไม 'Timer_t' ถูกกำหนดในไลบรารี่มาตรฐาน c เท่านั้น?

  2. สถานการณ์นี้มักจะเกิดขึ้นหรือไม่ ฉันหมายถึงมีฟังก์ชั่นหรือคุณสมบัติที่แตกต่างกันระหว่างระบบปฏิบัติการที่แตกต่างกันหรือไม่?


ประเภทtimer_tไม่ได้เป็น "กำหนดไว้ใน linux เท่านั้น" เช่นบน Windows / Cygwin และมีการกำหนดไว้ด้วย ตามคำจำกัดความในไฟล์ส่วนหัว (Linux และ Cygwin) ดูเหมือนว่าจะเป็นประเภทมาตรฐาน POSIX (นอกเหนือจากนั้นบางแพลตฟอร์มอาจไม่สอดคล้องกับมาตรฐานฉันไม่เห็นสถานการณ์เฉพาะใด ๆ ที่ "ปกติเกิดขึ้น" ตามที่คุณกำหนดไว้) WRT คำถามทั่วไปเกี่ยวกับความแตกต่างในไลบรารีภาษา ขึ้นอยู่กับว่าผู้ขายปฏิบัติตามมาตรฐานหรือเป็นไปตามรุ่นใด
Janis

นี่คือการอ้างอิงจาก POSIX: pubs.opengroup.org/onlinepubs/009695399/functions/ …
teppic

@ MarkPlotnick: นั่นเป็นคำตอบ
การแข่งขัน Lightness ใน Orbit

@LightningRacisinObrit ฉันเสียใจที่ฉันเขียนคำตอบ (บางส่วน) เป็นความคิดเห็น ฉันลบมันแล้ว
Mark Plotnick

คำตอบ:


11

Unix และ C มีประวัติพันกันเนื่องจากทั้งคู่พัฒนาในเวลาเดียวกันที่ Bell Labs ใน New Jersey และหนึ่งในวัตถุประสงค์หลักของ C คือการนำ Unix มาใช้ในระดับสูงสถาปัตยกรรมอิสระภาษาแบบพกพา แต่มีไม่ได้มาตรฐานอย่างเป็นทางการจนกว่าจะถึงปี 1983 POSIXที่ "อินเตอร์เฟซระบบปฏิบัติการแบบพกพา" เป็นระบบปฏิบัติการมาตรฐาน IEEE ย้อนหลังมาตรฐานเวลาของ"ยูนิกซ์ร์วอร์ส" มันได้รับการพัฒนามานับ แต่นั้นมาและตอนนี้ก็เป็นมาตรฐานที่นำไปใช้อย่างกว้างขวางที่สุด OSX เป็นไปตาม POSIX อย่างเป็นทางการและ linux ไม่เป็นทางการ - มีโลจิสติกส์และค่าใช้จ่ายที่เกี่ยวข้องกับการปฏิบัติตามกฎระเบียบอย่างเป็นทางการที่ linux distros ไม่เข้าร่วม

สิ่งที่ POSIX มุ่งเน้นคือความละเอียดของสิ่งต่าง ๆ ที่ไม่ได้เป็นส่วนหนึ่งของ ISO C. Time.h คือ แต่รุ่น ISO ไม่รวมtimer_tประเภทหรือฟังก์ชั่นใด ๆ ที่ใช้งาน สิ่งเหล่านี้มาจากส่วนขยาย POSIXดังนั้นการอ้างอิงนี้ในส่วนหัวของ linux:

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

__USE_POSIX199309เป็นสัญลักษณ์ที่ glibc ภายในที่ตั้งอยู่ใน features.h เมื่อ_POSIX_C_SOURCE >= 199309Lหมายความว่า POSIX.1b คือการได้รับการสนับสนุน (ดูfeature_test_macros manpage) _XOPEN_SOURCE >= 600นี้ได้รับการสนับสนุนด้วย

มีฟังก์ชั่นหรือคุณสมบัติที่กำหนดแตกต่างกันระหว่างระบบปฏิบัติการที่แตกต่างกันหรือไม่?

ฉันคิดว่าสำหรับ C ในระบบ POSIX นั้นมีความพยายามที่จะหลีกเลี่ยงสิ่งนั้น แต่มันเกิดขึ้นได้ มีส่วนขยาย GNU บางส่วน (เช่นsterror_r()) ที่มีลายเซ็นที่เข้ากันไม่ได้จากคู่ของ POSIX อาจเป็นไปได้นี้เกิดขึ้นเมื่อ POSIX จะขึ้นขยาย แต่ปรับเปลี่ยนหรืออื่น ๆ ที่พวกเขามีทางเลือกเพียงแค่ฝันขึ้นโดย GNU - คุณสามารถเลือกหนึ่งหรืออื่น ๆ #defineโดยการใช้ที่เหมาะสม


ดีมาก! ช่างเป็นคำอธิบายที่ดีจริงๆ!
casamia

1
มาตรฐาน POSIX และ C ส่วนหนึ่งเกี่ยวกับการแยก C ออกจาก Unix - ทั้งสองเชื่อมโยงกันอย่างใกล้ชิดจนบางครั้งก็ไม่ชัดเจนว่าเกิดอะไรขึ้น
teppic

2

timer_tจะถูกใช้โดย APIs timer_ ใน POSIX timer_create()เช่น ใน POSIX เวอร์ชัน UNIX 03 นั้นเป็นส่วนเสริมของ POSIX และ macOS ไม่ได้ใช้งาน Linux และ Solaris และ UN * Xes อื่น ๆ

ดังนั้นรหัสที่คุณดูอาจทำงานกับ Linux และ Solaris แต่จะไม่ทำงานบน macOS ยกเว้นว่า Apple จะใช้ API ตัวจับเวลาในอนาคต (เป็นส่วนหนึ่งของข้อมูลจำเพาะ POSIX เวอร์ชันปัจจุบันดังนั้น Apple จะต้องทำเช่นนั้นหากพวกเขาต้องการสอดคล้องกับรุ่นที่ 4 แทนที่จะเป็นรุ่นที่ 3 ของข้อกำหนด)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.