GNU/Linux >> Znalost Linux >  >> Linux

Maximální hodnoty pro time_t (struct timespec)

Protože lidé zde odpovídají, jak nastavit maximum time_t a další odhady ohledně jeho typu, myslel jsem, že přidám c++ způsob, jak to udělat:

#include <limits>
...
time_t maxTime = std::numeric_limits<time_t>::max();

Moc by mě nezajímalo, co je součástí time_t , ale o tom, co je rozumné. Na jakémkoli systému, který jsem viděl, time_t dokáže zakódovat časové rozpětí kdekoli od 63 let do 10 let (skoro každý systém, který znám, používá 64bitová čísla, od té doby, co tito géniové přišli v roce 1999 s věcí Y2K, která skončí světem, se teprve uvidí, kdo si všimne mnohem většího „událost“, až uplyne rok 2038).

Pokud rozumně očekáváte že váš program nebude běžet déle než 50 let, odmítněte jakoukoli hodnotu větší než 50*365*86400 nebo hodnotu jednoduše nasyťte. Neočekávám, že některý z programů, které nyní píšu, se bude používat za 50 let (ačkoli se toho nedožiji, abych to ověřil).
Na druhou stranu, pokud váš systém dělá použijte 32bitový time_t , pak na tom stejně nezáleží, protože systémový čas přeteče za 50 let tak či tak, takže stejně nelze sestrojit smysluplný čas bez posunutí epochy.

Pokud se zeptáte "jak dlouho chcete pauzu?" a uživatel říká „250 let“, nepovažoval bych to za skutečně nesprávné chování programu, pokud byste řekli „ano, správně, 50 bude také stačit“. Protože, hej, rozdíl opravdu není pozorovatelný.


Podle Wikipedie time_t může být celé číslo nebo číslo s pohyblivou řádovou čárkou, ale obvykle se jedná o 32bitové nebo 64bitové celé číslo se znaménkem. Myslím, že největší bezpečná hodnota, kterou můžete předpokládat, je INT_MAX . Pro time_t alespoň záporná čísla jsou legální a vztahují se k 1. lednu 1970.


Bohužel norma ISO C (aktuálně C11) neposkytuje žádný způsob, jak získat maximální hodnotu time_t . Pokud tedy člověk nepoužívá nástroje, jako je Autoconf poskytující informace, je třeba udělat nějaké předpoklady.

Za předpokladu, že time_t je celočíselný typ bez výplňových bitů (což je případ většiny dnešních platforem, ne-li všech), lze pravděpodobně vzít:

(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1

což je maximální reprezentovatelná hodnota pro typ celého čísla se znaménkem (ale skutečnost, že hodnotu lze reprezentovat v time_t neznamená, že je systémem podporován jako time_t hodnota).

Můžete také chtít zjistit, zda time_t je celočíselný typ. Norma ISO C určuje, že time_t je skutečný typ (bod 7.27.1). Podle definice skutečný typ je buď celočíselný typ, nebo skutečný plovoucí typ (float , double nebo long double a případně další přidané v budoucích verzích normy, jak je uvedeno v článku 6.11.1). Pokud tedy time_t není celočíselný typ, je to nutně skutečný plovoucí typ. V důsledku toho lze zjistit, zda time_t je celočíselný typ s testem (time_t) 1 / 2 == 0 .

Poznámka:Standard C striktně nevyžaduje (T) 1 / 2 být odlišný od 0, pokud T je plovoucí typ, ale pokud tomu tak není, mám podezření, že takové platformy by měly vážné problémy s výpočty s plovoucí desetinnou čárkou.


Linux
  1. Výukový program příkazů typu Linux pro začátečníky (s příklady)

  2. Kurz příkazu typu s příklady pro začátečníky

  3. Jak najít platné hodnoty pro termín k použití v Tmux?

  1. Co je time_t nakonec typedef pro?

  2. Jak odlišíte adresář pouze pro soubory určitého typu?

  3. Formátování struct timespec

  1. Co definuje maximální velikost pro jeden příkazový argument?

  2. Jaké je ID oddílu / typ souborového systému pro UDF?

  3. Nastavte maximální rychlost pro scp