Wygląda na to, że nie jest to możliwe. Na początek jest tylko jedna funkcja time()
w systemie Linux, nie time32()
lub time64()
.
Po chwili szukania, widzę, że to nie wina libc, ale winowajcą jest w rzeczywistości jądro.
Aby libc celu pobrania aktualny czas niezbędny dla wykonania połączenia system komputerowy: (Source)
time_t time (t) time_t *t;
{
// ...
INTERNAL_SYSCALL_DECL (err);
time_t res = INTERNAL_SYSCALL (time, err, 1, NULL);
// ...
return res;
}
Połączenie systemu jest zdefiniowany jako: (Source)
SYSCALL_DEFINE1(time, time_t __user *, tloc)
{
time_t i = get_seconds();
// ...
return i;
}
funkcja get_seconds()
zwraca unsigned long
, tak jak poniżej: (Source)
unsigned long get_seconds(void)
{
struct timekeeper *tk = &timekeeper;
return tk->xtime_sec;
}
I timekeeper.xtime_sec
jest rzeczywiście 64-bitowe: (Source)
struct timekeeper {
// ...
/* Current CLOCK_REALTIME time in seconds */
u64 xtime_sec;
// ...
}
Teraz, jeśli znasz C, wiesz, że wielkość unsigned long
jest w rzeczywistości zależna od implementacji . Na moim 64-bitowym komputerze jest to 64-bitowy; ale na moim 32-bitowym komputerze tutaj jest 32-bitowy. Może on być w wersji 64-bitowej w niektórych implementacjach 32-bitowych, ale nie ma żadnej gwarancji.
Z drugiej strony, u64
jest zawsze 64-bitowy, więc na samym poziomie jądro śledzi czas w typie 64-bitowym. Dlaczego następnie zwraca go jako unsigned long
, który nie ma gwarancji, że jest 64-bitowy, jest poza mną.
W końcu, nawet jeśli libc wymusiłoby time_t
zachowanie 64-bitowej wartości, nie zmieniłoby to niczego.
Możesz umieścić swoją aplikację głęboko w jądrze, ale nie sądzę, że warto.
@Benoit To pytanie nie jest duplikatem, jest zupełnie inne. – interjay
Niezupełnie ... w 32-bitowym systemie Linux, 'time_t' to tradycyjna 32-bitowa ilość podpisana, z pozostałymi 25 latami użyteczności. W 64-bitowych systemach uniksowych jest to już 64-bitowa ilość. Jeśli chcesz mieć przenośny typ, będziesz musiał zdefiniować swój własny, który odpowiednio mapuje lub po prostu ostrożnie użyjesz 'time_t'. Inne zadane pytanie zawiera istotne informacje (ale zgadzam się, że nie jest to duplikat). –
zobacz także ** [64-bitowy UNIX Timestamp Conversion] (http://stackoverflow.com/questions/7914368/64-bit-unix-timestamp-conversion) ** –