errno 與 gmtime_r
errno 的正確用法
- 函數不會清掉 errno
- 只有函數回報失敗時(回傳
NULL、-1等,看文件),errno 才有意義
c
// ❌ 成功時 errno 也可能非 0(內部 open 時區檔失敗但有 fallback)
errno = 0;
gmtime_r(&t, &tm);
if (errno) perror("gmtime_r");
// ✅
if (!gmtime_r(&t, &tm)) perror("gmtime_r");gmtime_r 的效能
gmtime_r與localtime_r共用實作,會呼叫tzset_internal讀時區設定並更新全域狀態- thread-safe 是靠 lock → 多 thread 頻繁呼叫時大量時間花在 kernel mode
- 高頻呼叫可以考慮自己算,或用 Boost Posix Time、C++20
<chrono>