Tại sao là bộ đếm thời gian, định dạng tiếng Việt được định nghĩa trong thời gian của Long.h trên Linux mà không phải là OS X


11

Trong khi tôi đang đọc một tệp mã nguồn C, tôi đã tìm thấy khai báo này. (Mã nguồn này được viết cho chương trình hệ thống linux. Đây là thông tin rất quan trọng)

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

static timer_t* _interval_timer;
...

Lúc đầu, tôi muốn biết thêm về 'timer_t'. Vì vậy, tôi đã googled 'time.h' để có được thông tin tiêu đề. Nhưng, không có bất kỳ từ nào về 'timer_t', chỉ đề cập đến 'time_t'.

Vì tò mò, tôi đã tìm kiếm và mở tệp thư viện tiêu chuẩn 'time.h' trong máy tính 'mac' của mình (như bạn biết, / usr / bao gồm thư mục lưu trữ các tệp thư viện chuẩn.) Nhưng tệp này giống với tệp đã được googled trước đó.

Cuối cùng, tôi đã bật hệ điều hành linux (ub Ubuntu) của mình bằng máy ảo và thay thế 'time.h' trong thư mục thư viện chuẩn linux c (đường dẫn thư mục giống như OSX). Như tôi dự đoán, tệp 'time.h' trong linux có khai báo timer_t.

Tôi đã thêm các dòng mã khai báo loại 'timer_t' bên dưới.

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

Câu hỏi của tôi là này.

  1. Tại sao 'timer_t' chỉ được xác định trong thư viện chuẩn linux c?

  2. Tình trạng này có thường xảy ra không? Ý tôi là, có bất kỳ chức năng hoặc thuộc tính được xác định khác nhau giữa các hệ điều hành khác nhau không?


Loại timer_tkhông "chỉ được xác định trong linux", ví dụ như trên Windows / Cygwin, nó cũng được xác định. Theo các định nghĩa trong các tệp tiêu đề (Linux và Cygwin), nó dường như là một loại tiêu chuẩn POSIX. (Ngoài ra, một số nền tảng có thể không tuân thủ các tiêu chuẩn mà tôi không thấy bất kỳ tình huống cụ thể nào "thường xảy ra", như bạn đã xây dựng nó.) WRT câu hỏi chung của bạn về sự khác biệt trong các thư viện ngôn ngữ; nó phụ thuộc vào việc các nhà cung cấp tuân thủ các tiêu chuẩn hay với những phiên bản mà họ tuân thủ.
Janis

Đây là một tài liệu tham khảo từ POSIX: pubs.opengroup.org/onlinepub/009695399/fifts/ mẹo
teppic

@MarkPlotnick: Đó là một câu trả lời
Các cuộc đua nhẹ nhàng trong quỹ đạo

@LightningRacisinObrit Tôi rất tiếc vì tôi đã viết một câu trả lời (một phần) dưới dạng một nhận xét. Tôi đã gỡ bỏ nó.
Đánh dấu Plotnick

Câu trả lời:


11

Unix và C có một lịch sử đan xen, vì cả hai đều được phát triển cùng thời gian tại Bell Labs ở New Jersey và một trong những mục đích chính của C là triển khai Unix bằng ngôn ngữ di động, độc lập với kiến ​​trúc cao. Tuy nhiên, không có bất kỳ tiêu chuẩn hóa chính thức nào cho đến năm 1983. POSIX , "giao diện hệ điều hành di động" là một tiêu chuẩn của hệ điều hành IEEE có từ thời "Chiến tranh Unix" . Nó đã được phát triển kể từ đó và bây giờ là tiêu chuẩn như vậy được thực hiện rộng rãi nhất. OSX chính thức tuân thủ POSIX và linux không chính thức - có hậu cần và chi phí liên quan đến tuân thủ chính thức mà các bản phân phối linux không tham gia.

Phần lớn những gì POSIX đã tập trung vào là sự phát triển của những thứ không phải là một phần của ISO C. Time.h, nhưng phiên bản ISO không bao gồm timer_tloại hoặc bất kỳ chức năng nào sử dụng nó. Đó là từ phần mở rộng POSIX , do đó tham chiếu này trong tiêu đề linux:

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

Các __USE_POSIX199309là một biểu tượng glibc nội bộ được thiết lập trong features.h khi _POSIX_C_SOURCE >= 199309L, có nghĩa là POSIX.1b là để được hỗ trợ (xem feature_test_macros manpage). Điều này cũng được hỗ trợ với _XOPEN_SOURCE >= 600.

Có bất kỳ chức năng hoặc thuộc tính được xác định khác nhau giữa các hệ điều hành khác nhau?

Tôi nghĩ liên quan đến C, trong số các hệ thống POSIX, có một nỗ lực để tránh điều đó, nhưng nó đã xảy ra. Có một số phần mở rộng GNU (ví dụ sterror_r()) có chữ ký không tương thích từ các đối tác POSIX của chúng. Có thể điều này xảy ra khi POSIX chiếm tiện ích mở rộng nhưng sửa đổi nó, hoặc nếu không thì chúng chỉ là lựa chọn thay thế được GNU mơ ước - bạn có thể chọn cách này hay cách khác bằng cách sử dụng một phần thích hợp #define.


Rất đẹp! Thật là một lời giải thích tử tế!
casamia

1
Các tiêu chuẩn POSIX và C là một phần về việc tách C khỏi Unix - hai tiêu chuẩn được liên kết chặt chẽ đến mức đôi khi không rõ điều gì đã đi đến đâu.
teppic

2

timer_tđược sử dụng bởi các bộ đếm thời gian_ API trong POSIX, chẳng hạn như timer_create(). Trong phiên bản UNIX 03 của POSIX, đây là một phần tùy chọn của POSIX và macOS đã không triển khai nó. Linux và Solaris, và có thể một số UN * Xes khác, đã làm.

Vì vậy, mã bạn đang xem có thể hoạt động trên Linux và Solaris, nhưng sẽ không hoạt động trên macOS, trừ khi Apple triển khai API hẹn giờ trong tương lai. (Chúng là một phần của phiên bản hiện tại của thông số kỹ thuật POSIX, vì vậy Apple sẽ phải làm như vậy nếu họ muốn tuân thủ phiên bản 4, thay vì phiên bản 3 của thông số kỹ thuật.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.