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
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
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 */
};
là chúng vừa an toàn vừa không? –
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
đố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
gmtime_r
và localtime_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 gmtime
và localtime
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_r
và localtime_r
đưa con trỏ đến nơi lưu trữ kết quả.
gmtime_s
và localtime_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 gmtime
và localtime
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_s
và localtime_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.)
'gmtime_s' và' localtime_s' cũng có trong C11. – Lyberta
@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. –
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