29: printf('tcp-порт: %d
', ntohs(service->s_port));
31: /* отобразить все псевдонимы, которые имеет данная служба */
32: if (*service->s_aliases) {
33: printf('псевдонимы:');
34: for (ptr = service->s_aliases; *ptr; ptr++)
35: printf(' %s', *ptr);
36: printf('
');
37: }
38:
39: return 0;
40: }
Ниже показан пример запуска программы. Обратите внимание на то, что она извлекает службы либо по каноническому имени, либо по псевдониму.
$ ./services http
служба: http
tcp-порт: 80
$ ./services source
служба: chargen
tcp-порт: 19
псевдонимы: ttytst source
Глава 18
Время
18.1. Вывод времени и даты
18.1.1. Представление времени
В системах Unix и Linux время отслеживается в секундах до или после начала эпохи, которое определяется как полночь 1 января 1970 года по UTC[148]. Положительные значения времени относятся к периоду после начала эпохи; отрицательные — до начала эпохи. Для того чтобы обеспечить работу процессов в режиме текущего времени, в Linux, как и во всех остальных версиях Unix, предусмотрен системный вызов time() .
#include <time.h>
time_t time (time_t *t);
Функция time() возвращает количество секунд, прошедших с момента начала эпохи. Если значение t не является нулевым, то данная функция передает в эту переменную количество секунд, прошедших с начала эпохи.
Для решения некоторых проблем требуется более высокая разрешающая способность. В Linux предусмотрен еще один системный вызов — gettimeofday(), который предоставляет более подробную информацию.
#include <sys/time.h>
#include <unistd.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval {
int tv_sec; /* секунды */
int tv_usec; /* микросекунды */
};
struct timezone {
int tz_minuteswest; /* минуты на запад от Гринвича */
int tz_dsttime; /* тип корректировки dst */
};
На большинстве платформ, включая i386, система Linux поддерживает возможность очень точного измерения времени. Стандартные персональные компьютеры содержат встроенные часы, которые обеспечивают информацию о текущем времени с точностью до микросекунд. Оборудование Alpha и SPARC также предлагает высокоточный таймер. На некоторых других платформах система Linux может отслеживать время только в пределах разрешающей способности системного таймера, который в общем случае устанавливается на значение 100 Гц. В связи с этим член tv_usec структуры timeval в подобных системах может иметь меньшую точность.
В sys/time.h определены пять макросов для обработки структур timeval.
timerclear(struct timeval *)
Данный макрос очищает структуру timeval.
timerisset(struct timeval *)
Данный макрос проверяет структуру timeval на заполнение (другими словами, отличен ли хотя бы один элемент от нуля).
timercmp(struct timeval *t0, struct timeval *t1, operator)
Данный макрос позволяет сравнивать две структуры timeval в одном временном интервале. Он вычисляется в логический эквивалент t0 операция t1, если t0 и t1 относятся к арифметическим типам. Обратите внимание на то, что макрос timercmp() не работает для операций <= и >=. Вместо этого нужно применять формы !timercmp(t1, t2, >) и !timercmp(t1, t2, <) .
timeradd(struct timeval *t0, struct timeval *t1, struct timeval *result)
Добавляет t0 к t1 и размещает сумму в переменной result.
timersub(struct timeval *t0, struct timeval *t1, struct timeval *result)
Вычитает t1 из t0 и передает разность в переменную result.
Третье представление времени struct tm дает время в исчислении, более привычном для человека.
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
