2013-09-27 176 views
14

Sự khác nhau giữa hai hàm này là gì? Tôi đang sử dụng MinGW 4.8.0.sự khác biệt giữa gmtime_r và gmtime_s

Tôi biết rằng gmtime_r là chủ đề an toàn (nhưng không an toàn nếu gọi là nhiều lần từ cùng một sợi) nhưng tôi không hiểu gmtime_s

+0

có thể trùng lặp [Tương đương Windows của hàm Unix gmtime \ _r?] (Http: // stackoverflow). com/questions/12044519/what-is-the-windows-tương đương-of-the-unix-function-gmtime-r) – o11c

Trả lời

13

Sự khác biệt là gmtime_r(3) là một standard SUSv2 function. Gần nhất bạn có thể tìm đến gmtime_r() trên một môi trường cửa sổ là gmtime_s(), trong đó có đối số của nó đảo ngược:

  • gmtime_r(const time_t*, struct tm*)
  • gmtime_s(struct tm*, const time_t*)

Về cơ bản, cả hai đều chuyển đổi một giá trị thời gian tới một cấu trúc tm. gmtime_r sau đó trả lại một con trỏ đến cấu trúc này (hoặc NULL nếu không thành công), trong khi gmtime_s trả về 0 nếu thành công và errno_t trong trường hợp không thành công.

Cấu trúc tm có cơ thể sau, như có thể được nhìn thấy từ cả hai tài liệu liệt kê ở trên:

struct tm { 
    int tm_sec;   /* seconds */ 
    int tm_min;   /* minutes */ 
    int tm_hour;  /* hours */ 
    int tm_mday;  /* day of the month */ 
    int tm_mon;   /* month */ 
    int tm_year;  /* year */ 
    int tm_wday;  /* day of the week */ 
    int tm_yday;  /* day in the year */ 
    int tm_isdst;  /* daylight saving time */ 
}; 
+0

là chúng vừa an toàn vừa không? –

+0

Về gmtime_s: như những gì tôi thấy, Windows các chức năng localtime và gmtime chuẩn đã an toàn thread, do đó, có – streppel

+0

đối với liên quan đến gmtime_r, [lấy từ đây] (http://linux.die.net/man/3/gmtime_r): "Bốn hàm asctime(), ctime(), gmtime() và localtime() trả về một con trỏ tới dữ liệu tĩnh và do đó không an toàn luồng. Các phiên bản an toàn chủ đề asctime_r(), ctime_r() , gmtime_r() và localtime_r() được chỉ định bởi SUSv2 " – streppel

7

gmtime_rlocaltime_r là chức năng POSIX tiêu chuẩn.

Mục đích chính của chúng là an toàn chủ đề (reentrancy). Các chức năng cơ bản gmtimelocaltime không an toàn cho chủ đề hoặc reentrant, vì chúng sử dụng một vùng tĩnh duy nhất để lưu trữ kết quả của chúng, do đó, gmtime_rlocaltime_r đưa con trỏ đến nơi lưu trữ kết quả.

gmtime_slocaltime_s đã được Microsoft giới thiệu và hiện là một phần của C11, mặc dù non-Microsoft support is limited. (Xem here để thảo luận thêm.)

Mục đích chính của chúng là bảo mật. Chúng được thêm vào như một phần của Secure CRT của Microsoft (Secure C Run-Time). Từ những gì tôi hiểu, an toàn luồng không phải là vấn đề với gmtimelocaltime trong CRT của Microsoft, vì các vùng đầu ra tĩnh của các hàm này đã được phân bổ cho mỗi chuỗi. Thay vào đó, gmtime_slocaltime_s đã được thêm vào để thực hiện AN2 của CRT an toàn parameter validation. (Nói cách khác, họ kiểm tra xem các thông số của họ là NULL, trong trường hợp này họ gọi xử lý lỗi.)

+0

'gmtime_s' và' localtime_s' cũng có trong C11. – Lyberta

+0

@FaTony - Tôi đã quên điều đó. Cảm ơn bạn đã thông tin; Tôi đã cập nhật câu trả lời của mình. –