2010-06-18 2 views
11

Как я могу восстановить время работы под Linux с помощью C? (Без использования POPEN и/или/Proc)Uptime под linux в C

Благодаря

ответ

21

Via top или через uptime, но я не знаю о каких-либо системного вызова, кто-то наверняка :)

uptime должно быть довольно легко для синтаксического анализа.

Просто наткнулся на это:

#include <sys/sysinfo.h> 

struct sysinfo info; 
sysinfo(&info); 
printf("Uptime = %ld\n", info.uptime); 
+1

Horray для sysinfo() :) NB: 'struct sysinfo' довольно« сдвинутый »между 2.4 (ранним) 2.4 (поздним) и 2.6. Если ваш код, скорее всего, будет использоваться для устройств, его можно запустить, чтобы проверить, какие члены могут отличаться. –

+0

printf ("Время работы:% 02ld:% 02ld:% 02ld \ n", info.uptime/3600, info.uptime% 3600/60, info.uptime% 60); –

+0

Однако '', похоже, не существует, когда вы компилируете ядро ​​(vagrant & trusty64):/Как это сделать в этой ситуации? – Emixam23

2

Если его там и содержит элемент uptime, struct sysinfo является предпочтительным способом пойти, так как Jack explained.

Другой способ - читать btime из /proc/stat, а затем просто вычесть его из текущего времени. btime - это всего лишь эпоха UNIX, указывающая, когда ядро ​​загрузилось.

Это дает вам количество секунд с момента загрузки, которые затем можно перевести на годы/месяцы/дни/часы/и т. Д. Это экономит на то, чтобы иметь дело со строками в /proc/uptime. Если btime не существует, а struct sysinfo не имеет ни одного участника с именем uptime, вам нужно разобрать /proc/uptime.

Для современных ядер sysinfo() должен работать нормально. Большинство вещей, все еще работающих 2.4 (или раньше) в дикой природе, являются устройствами какого-либо типа или других встроенных систем.

1

Чтобы получить начальное время системы более переносимым способом, было бы использовать «who -b». Чтобы использовать это в программе, вам придется порождать оболочку и интерпретировать ее вывод. К сожалению, это единственное место, где такая информация доступна в POSIX, и это также только как расширение.

Смежные вопросы