Chciałbym uzyskać czas sprawności systemu z poziomu aplikacji C działającej w systemie opartym na systemie Linux. Nie chcę wywoływać uptime (1) i analizować wyników, chciałbym nazwać bazowym API C, podejrzewam, że istnieje. Ktoś wie, czy jest takie połączenie, czy uptime (1) po prostu przetwarza rekordy uzyskane od wtmp?Jakie API mam wywołać, aby uzyskać czas sprawności systemu?
Odpowiedz
System zadzwonić szukasz jest sysinfo().
Jest zdefiniowana w sys/sysinfo.h
Jego podpis jest: int sysinfo (struct sysinfo * info)
Ponieważ jądro 2.4, struktura wyglądała następująco:
struct sysinfo {
long uptime; /* Seconds since boot */
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* swap space still available */
unsigned short procs; /* Number of current processes */
unsigned long totalhigh; /* Total high memory size */
unsigned long freehigh; /* Available high memory size */
unsigned int mem_unit; /* Memory unit size in bytes */
char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */
};
Miłej zabawy!
Zaimplementowałem czytanie/proc/uptime, jak sugerowałem powyżej, ale wywołanie API w porównaniu z odczytaniem "pliku" jest dokładnie tym, czego chciałem. Dziękuję Ci! –
Czy można uzyskać informacje o poziomie nano sekund (dla czasu pracy)? – Jeyaram
Przeczytaj plik /proc/uptime
i jako pierwszy czas pracy w sekundach przyjmuj pierwszą liczbę dziesiętną.
Od man 5 proc
:
/proc/uptime
This file contains two numbers: the uptime of the system (sec‐
onds), and the amount of time spent in idle process (seconds).
... a jeśli "strace" komendę 'uptime (1)', zobaczysz, że to właśnie robi. – caf
caf: na maszynach linuksowych, maszyny BSD na ogół używają "aktualnego czasu - syctl kern.boottime" – Tarrant
@caf, 'uptime (1)' robi o wiele więcej niż tylko to, więc może być nieco trudne do znalezienia :) – bdonlan
To byłoby coś takiego.
Zobacz "man sysinfo", aby uzyskać więcej informacji.
You missing: #include
Istnieje również clock_gettime (prawdopodobnie potrzebuje -lrt
). Zachowanie, które widziałem (nie zamierzam twierdzić, że jest to gwarantowane), ale podane jako CLOCK_MONOTONIC
jako clk_id
jest to, że zwraca czas działania systemu w danym parametrze struct timespec *
.
#include <stdio.h>
#include <time.h>
int main(int argc, char* argv[]) {
struct timespec t;
clock_gettime(CLOCK_MONOTONIC, &t);
printf("tv_sec=%llu tv_nsec=%llu\n",
(unsigned long long)t.tv_sec,
(unsigned long long)t.tv_nsec);
return 0;
}
Nie, nie ma; monotoniczny zegar ma dowolną epokę. Ta strona podręcznika, którą łączysz, mówi właśnie to. –
@BoundaryImposition Pytanie jest oznaczone linuxem, a w Linuksie zachowanie było (i [nadal jest] (http://elixir.free-electrons.com/linux/latest/ident/CLOCK_MONOTONIC) jak opisałem). POSIX mówi, że epoka jest dowolna, implementacja Linuksa koreluje z czasem działania. Zobacz [kernel/time/posix-timers.c] (http://elixir.free-electrons.com/linux/latest/source/kernel/time/posix-timers.c) i [fs/proc/uptime.c ] (http://elixir.free-electrons.com/linux/latest/source/fs/proc/uptime.c). I [tutaj jest odpowiedni wątek LKML] (https://lkml.org/lkml/2014/1/2/39). – opello
Połączyłeś się z plikami implementacyjnymi. To może się zmienić w dowolnym momencie. Pytanie dotyczy interfejsu API, a interfejs API mówi, że epoka jest dowolna. Arbitralne nie oznacza, że nie ma epoki, oznacza to po prostu, że nie można polegać na wyborze. Wątek LKML, do którego mnie przyłączyłeś, faktycznie to określa. –
#include <sys/sysinfo.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <grp.h>
int main() {
struct sysinfo sys_info;
struct group* grp;
gid_t gid;
char** users;
int days, hours, mins, x = 1;
system("clear");
printf("\033[4;40m Systems information \033[0;m \n");
if(sysinfo(&sys_info) != 0)
perror("sysinfo");
days = sys_info.uptime/86400;
hours = (sys_info.uptime/3600) - (days * 24);
mins = (sys_info.uptime/60) - (days * 1440) - (hours * 60);
printf("\033[1;33m Uptime: \033[0;36m %ddays, %dhours, %dminutes, %ldseconds \033[0;m \n",
days, hours, mins, sys_info.uptime % 60);
printf("\033[1;33m Load Avgs: \033[0;m 1min(%ld) 5min(%ld) 15min(%ld) \n",
sys_info.loads[0], sys_info.loads[1], sys_info.loads[2]);
printf("\033[1;33m Total Ram: \033[0;m %ldk \t Free: %ldk \n", sys_info.totalram/1024, sys_info.freeram/1024);
printf(" \033[1;33m Shared Ram: \033[0;m %ldk ", sys_info.sharedram/1024);
printf(" Buffered Ram: %ldk \n", sys_info.bufferram/1024);
printf("\033[1;33m Total Swap: \033[0;m %ldk \t Free swap: %ldk \n", sys_info.totalswap/1024, sys_info.freeswap/1024);
printf("\033[1;33m Total High Memory: \033[0;m %ldk Free high memory: %ldk \033[0;m \n", sys_info.totalhigh/1024, sys_info.freehigh/1024);
printf(" \n");
printf("\033[1;44m Total Number of processes: %d \033[0;m \n", sys_info.procs);
gid = getgid();
printf(" Group ID: \033[031m %d", gid);
if((grp = getgrgid(gid)) == NULL) return 1;
printf("\033[0;m Group %s ", grp->gr_name);
printf("\n Users in your group ");
for(users = grp->gr_mem; *users != NULL; users++,++x); printf("%d", ++x);
if(strcmp(grp->gr_passwd,"x") == 0) printf(" Password is protected by shadow file. \n");
else printf("Password: %s ", grp->gr_passwd);
return 0;
}
Dobra odpowiedź powinna obejmować nie tylko kod, ale także wyjaśnienie, jak to działa i dlaczego odpowiada na pytanie. Jest to szczególnie ważne, ponieważ istnieje już akceptowana odpowiedź na to pytanie. – Blackwood
- 1. Jak uzyskać czas uruchamiania systemu Android?
- 2. Zastosowanie uFormat aby uzyskać czas uniksowy
- 3. Node.js, aby uzyskać/określić wersję systemu operacyjnego
- 4. nie mam dostępu, aby uzyskać wszystkie invitable_friends Facebook API przy użyciu javascript
- 5. Jak uzyskać czas działania systemu w systemie Windows?
- 6. Jakie aktualizacje zainstalować, aby uzyskać najnowszą wersję Delphi 2007?
- 7. Jaki jest najlepszy sposób, aby uzyskać czas trwania połączenia API przy użyciu Guzzle 6
- 8. Free Rest API, aby uzyskać aktualny czas jako ciąg (strefa czasowa nieistotna)
- 9. ScheduledExecutorService: kiedy należy wywołać zamknięcie systemu?
- 10. Tomcat 7 - gdzie mam ustawić "właściwości systemu"?
- 11. Jak uzyskać czas UTC
- 12. Czy istnieje biblioteka Java, aby uzyskać dostęp do rodzimego interfejsu API systemu Windows?
- 13. Jak korzystać z internetowego serwera czasu, aby uzyskać czas?
- 14. Jak korzystać z struct timeval, aby uzyskać czas wykonania?
- 15. Aby uzyskać czas wykonywania kwerendy MYSQL w zapytaniu
- 16. jak używać process.hrtime, aby uzyskać czas wykonania funkcji asynchronicznej
- 17. Jakie biblioteki należy użyć, aby uzyskać lepszą obróbkę OCaml?
- 18. Jak uzyskać wiosnę, aby wydrukować, jakie profile sprężyn są aktywne?
- 19. Pozostały czas do zawieszenia systemu Windows
- 20. Mam HTML odpowiedź kodowanie moim Web API
- 21. Czas ostatniej modyfikacji systemu Android dla pliku
- 22. Scapy uzyskać czas przylotu pakietu
- 23. uzyskać czas w przyrostach 1ms
- 24. uzyskać czas trwania pliku audio
- 25. Zadzwoń do systemu operacyjnego, aby otworzyć URL?
- 26. Amazon DynamoDB, aby uzyskać przedmioty o wartości atrybutu ... (Java API)
- 27. Jak uwierzytelniania OAuth, aby uzyskać dostęp do API EWS
- 28. Jak wywołać API Spotify z C#
- 29. Mylił się, jak sprawdzić wiosenny formularz mvc, jakie mam opcje?
- 30. Czas trwania działania interfejsu ASP Web API
jest to możliwe, aby uzyskać czas pracy w nano sekund ??? Czy próbowałeś ? – Jeyaram