GNU/Linux >> Linux Esercitazione >  >> Linux

Valori massimi per time_t (struct timespec)

Dal momento che le persone qui stanno rispondendo a come impostare il massimo time_t value, e fare ulteriori congetture sul suo tipo, ho pensato di aggiungere il c++ modo per farlo:

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

Non mi importerebbe così tanto di cosa va in un time_t , ma su ciò che è ragionevole. Su qualsiasi sistema che ho visto, un time_t può codificare periodi di tempo ovunque da 63 anni a 10 anni (praticamente ogni sistema che conosco utilizza numeri a 64 bit da quando questi geni si sono inventati la cosa Y2K che il mondo finirà nel 1999, resta da vedere chi noterà il molto più grande "evento" quando passa l'anno 2038).

Se ti aspetti ragionevolmente che il tuo programma non sarà in esecuzione per più di 50 anni, rifiuta qualsiasi valore superiore a 50*365*86400 o semplicemente satura il valore. Non mi aspetto che nessuno dei programmi che scrivo ora venga utilizzato tra 50 anni (anche se non vivrò per verificarlo).
D'altra parte, se il tuo sistema fa usa un time_t a 32 bit , allora non importa comunque, perché il tempo del sistema sarà comunque traboccato in 50 anni, quindi non si può comunque costruire un tempo significativo senza cambiare epoca.

Se chiedi "per quanto tempo vuoi mettere in pausa?" e l'utente dice "250 anni", non lo riterrei un comportamento del programma veramente errato se dicessi "sì, va bene, anche 50 lo faranno". Perché, ehi, la differenza non è davvero osservabile.


Secondo Wikipedia, time_t può essere un numero intero o in virgola mobile, ma di solito è un numero intero con segno a 32 o 64 bit. Penso che il valore sicuro più grande che puoi assumere sia INT_MAX . Per time_t almeno i numeri negativi sono legali e si riferiscono a prima del 1 gennaio 1970.


Sfortunatamente lo standard ISO C (attualmente C11) non fornisce alcun modo per ottenere il valore massimo di time_t . Quindi, a meno che non si utilizzino strumenti come Autoconf che forniscono informazioni, è necessario fare alcune ipotesi.

Supponendo che time_t è un tipo intero senza bit di riempimento (che è il caso sulla maggior parte delle piattaforme al giorno d'oggi, se non su tutte), si può probabilmente prendere:

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

che è il massimo valore rappresentabile per un tipo intero con segno (ma il fatto che un valore sia rappresentabile in time_t non significa che sia supportato dal sistema come time_t valore).

Si potrebbe anche voler rilevare se time_t è un tipo intero. Lo standard ISO C specifica che time_t è un tipo reale (Clausola 7.27.1). Per definizione, un tipo reale è un tipo intero o un tipo mobile reale (float , double o long double , ed eventualmente altri aggiunti nelle versioni future dello standard, come menzionato nella clausola 6.11.1). Pertanto, se time_t non è un tipo intero, è necessariamente un vero tipo floating. Di conseguenza, è possibile rilevare se time_t è un tipo intero con il test (time_t) 1 / 2 == 0 .

Nota:lo standard C non richiede rigorosamente che (T) 1 / 2 essere diverso da 0 se T è un tipo mobile, ma se così non fosse, sospetto che tali piattaforme avrebbero seri problemi con i calcoli in virgola mobile.


Linux
  1. Cosa definisce la dimensione massima per un singolo argomento di comando?

  2. A cosa è time_t in definitiva un typedef?

  3. Converti millisecondi in timespec per la porta GNU

  4. grep in modo ricorsivo per un tipo di file specifico su Linux

  5. copy_to_user() e copy_from_user() per il tipo di dati di base

Ottieni i valori dell'elmo per un rilascio dell'elmo

Come disabilitare un alias in Bash per un singolo comando??

Come trovare l'applicazione per un tipo Mime su Linux?

Come cercare in Dconf chiavi o valori?

Come si esegue il diff di una directory solo per i file di un tipo specifico?

Formattazione struct timespec