time (1115162), страница 2
Текст из файла (страница 2)
ниже). Обсуждение использования этих функции находится ниже.Системный вызов nanosleep приостанавливает выполнение программы по крайней мере на интервал времени req.#include <time.h>int nanosleep(const struct timespec *req,struct timespec *rem);Структура timespec используется для задания интервалов времени с наносекундной(10−9 ) точностью.
Структура определена в файле <time.h> следующим образом.5struct timespec{time_t tv_sec;longtv_nsec;};/* секунды *//* наносекунды */Значение поля tv_nsec должно лежать в пределах 0–999 999 999.nanosleep приостанавливает выполнение программы по крайней мере на время, заданное в *req. Функция может завершиться раньше, если процесс получил неигнорируемыйсигнал. В этом случае функция возвращает -1, устанавливает переменную errno в значение EINTR и записывает оставшееся время в структуру, на которую указывает rem, еслиrem не равен NULL.
Значение *rem может быть использовано для вызова nanosleep длязавершения паузы.В отличие от sleep и usleep, nanosleep не использует никаких сигналов, стандартизован POSIX, позволяет задавать время с большей точностью и позволяет легко продолжитьпаузу после прерывания от сигнала.Для отсчёта времени система использует свой внутренний таймер, имеющий на некоторых машинах (например, i386) частоту 100 Гц, а на других машинах — 1000 Гц. Частота таймера определяется константой HZ, определённой в файле <time.h>. Это значит, что система не может приостановить выполнение пользовательского процесса на время, меньшеечем 1/HZ (на i386 это — 10 миллисекунд). Время выравнивается в сторону увеличения доближайшего значения, кратного 1/HZ.
Соответственно, оставшееся время выравнивается всторону увеличения до значения, кратного 1/HZ.Если процесс имеет приоритет реального времени (политика планирования SCHED_FIFOили SCHED_RR, тогда паузы на интервал времени, меньший 1/HZ могут выполняться с помощью циклов задержки.Функции приостановки выполнения программы должны использоваться, когда программа постоянно опрашивает какой-нибудь объект (например, каталог) и отслеживает изменения в нём. Например, программа, которая отслеживает появление в каталоге нового файла исразу же переносит этот файл в другой каталог.#include#include#include#include#include#include<stdio.h><stdlib.h><string.h><unistd.h><time.h><dirent.h>int main(int argc, char **argv){DIR*dd;struct dirent*de;struct timespec ts;charin_path[PATH_MAX+1];charout_path[PATH_MAX+1];if (argc != 3) {fprintf(stderr, "too few arguments\n");exit(1);}6while (1) {if (!(dd = opendir(argv[1]))) {perror("opendir");exit(1);}while ((de = readdir(dd))) {if (strcmp(de->d_name, ".") && strcmp(de->d_name, ".."))break;}if (!de) {closedir(dd);ts.tv_sec = 0;ts.tv_nsec = 1;nanosleep(&ts, NULL);} else {strcpy(in_path, argv[1]);strcat(in_path, "/");strcat(in_path, de->d_name);strcpy(out_path, argv[2]);strcat(out_path, "/");strcat(out_path, de->d_name);if (rename(in_path, out_path) < 0) {perror("rename");exit(1);}closedir(dd);}}return 0;}Если бы вызов nanosleep в строке 34 отсутствовал, программа бы постоянно опрашивала заданный каталог, бесполезно трача процессорное время.
Вызов nanosleep приостановит выполнение программы до следующего кванта времени, позволив нормально работатьдругим процессам.7.