Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

bash2: /mnt/floppy/x: Resource temporarily unavailable

 /* Возвращается ошибка */

$ kill %2 /* Завершить программу с блокировкой */

$ /* Нажать ENTER */

[2]- Terminated ch14-lockall /mnt/floppy/x /* Программа завершена */

$ echo something > /mnt/floppy/x /* Новая попытка изменения работает */

$ fg /* Вернуться в оболочку root */

su

# umount /mnt/floppy /* Демонтировать гибкий диск */

# exit /* Работа с оболочкой root закончена */

$

Пока выполняется

ch14-lockall
, она владеет блокировкой. Поскольку это обязательная блокировка, перенаправления ввода/вывода оболочки завершаются неудачей. После завершения
ch14-lockall
блокировки освобождаются, и перенаправление ввода/вывода достигает цели. Как упоминалось ранее, под GNU/Linux даже
root
не может аннулировать обязательную блокировку файла.

Немного отклоняясь в сторону, гибкие диски представляют отличный испытательный стенд для изучения того, как использовать инструменты, работающие с файловыми системами. Если вы сделаете что-то, что разрушит данные на гибком диске, это вряд ли будет катастрофическим, тогда как экспериментирование с действующими разделами на обычных жестких дисках значительно более рискованно.

14.3. Более точное время

Системный вызов

time
и тип
time_t
представляют время в секундах в формате отсчета с начала Эпохи. Разрешения в одну секунду на самом деле недостаточно, сегодняшние машины быстры, и часто бывает полезно различать временные интервалы в долях секунды. Начиная с 4.2 BSD, Berkley Unix представил ряд системных вызовов, которые сделали возможным получение и использование времени в долях секунд. Эти вызовы доступны на всех современных системах Unix, включая GNU/Linux.

14.3.1. Время в микросекундах:

gettimeofday

Первой задачей является получение времени дня:

#include <sys/time.h>

int gettimeofday(struct timeval *tv, void *tz); /* определение POSIX, а не GLIBC */

gettimeofday
позволяет получить время дня. [156] В случае успеха возвращается 0, при ошибке -1. Аргументы следующие:

struct timeval *tv

156

В справочной странице gettimeofday(2) документирована соответствующая функция

settimeofday
для использования суперпользователем (
root
) для установки времени дня всей системы — Примеч. автора.

Этот аргумент является указателем на

struct timeval
, которая вскоре будет описана и в которую система помещает текущее время.

void *tz

Это аргумент больше не используется; он имеет тип

void*
, поэтому он всегда должен равняться
NULL
. (Справочная страница описывает, для чего он использовался, а затем утверждает, что он устарел. Прочтите, если интересуетесь подробностями.)

Время представлено структурой

struct timeval
:

struct timeval {

 long tv_sec; /* секунды */

 long tv_usec; /* микросекунды */

};

Значение

tv_sec
представляет секунды с начала Эпохи;
tv_usec
является числом микросекунд в секунде.

Справочная страница GNU/Linux gettimeofday(2) документирует также следующие макросы:

#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)

#define timercmp(tvp, uvp, cmp) \

 ((tvp)->tv_sec cmp (uvp)->tv_sec || \

 (tvp)->tv_sec == (uvp)->tv_sec && \

 (tvp)->tv_usec cmp (uvp)->tv_usec)

#define timerclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0)

Эти макросы работают со значениями

struct timeval*
; то есть указателями на структуры, и их использование должно быть очевидным из их названий и кода. Особенно интересен макрос
timercmp
: третьим аргументом является оператор сравнения для указания вида сравнения. Например, рассмотрим определение того, является ли одна
struct timeval
меньше другой:

struct timeval t1, t2;

...

if (timercmp(&t1, & t2, <))

 /* t1 меньше, чем t2 */

Макрос развертывается в

((&t1)->tv_sec < (&t2)->tv_sec || \

(&t1)->tv_sec == (&t2)->tv_sec && \

(&t1)->tv_usec < (&t2)->tv_usec)

Это значит: «если

t1.tv_sec
меньше, чем
t2.tv_sec
, ИЛИ если они равны и
t1.tv_usec
меньше, чем
t2.tv_usec
, тогда…».

14.3.2. Файловое время в микросекундах:

utimes

В разделе 5.5.3 «Изменение временных отметок:

utime
» был описан системный вызов
utime
для установки времени последнего обращения и изменения данного файла. Некоторые файловые системы хранят эти временные отметки с разрешением в микросекунды (или еще точнее). Такие системы предусматривают системный вызов
utimes
(обратите внимание на завершающую s в названии) для установки времени обращения к файлу и его изменения с точностью до микросекунд:

#include <sys/time.h> /* XSI */

int utimes(char *filename, struct timeval tvp[2]);

Аргумент

tvp
должен указывать на массив из двух структур
struct timeval
, значения используются для времени доступа и изменения соответственно. Если
tvp
равен
NULL
, система использует текущее время дня.

POSIX обозначает ее как «традиционную» функцию, что означает, что она стандартизуется лишь для поддержки старого кода и не должна использоваться для новых приложений. Главная причина, пожалуй, в том, что нет определенного интерфейса для получения времени доступа и изменения файла в микросекундах;

struct stat
содержит лишь значения
time_t
, а не значения
struct timeval
.

Поделиться:
Популярные книги

Эволюционер из трущоб. Том 8

Панарин Антон
8. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 8

Linux программирование в примерах

Роббинс Арнольд
Компьютеры и Интернет:
программирование
ос и сети
5.00
рейтинг книги
Linux программирование в примерах

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Геном хищника. Книга четвертая

Гарцевич Евгений Александрович
4. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга четвертая

В теле пацана 6

Павлов Игорь Васильевич
6. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана 6

Ученик. Книга 4

Первухин Андрей Евгеньевич
4. Ученик
Фантастика:
фэнтези
5.67
рейтинг книги
Ученик. Книга 4

Хозяин Теней

Петров Максим Николаевич
1. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней

Повелители сумерек

Первушина Елена Владимировна
Фантастика:
фэнтези
ужасы и мистика
юмористическая фантастика
детективная фантастика
6.00
рейтинг книги
Повелители сумерек

Мл. сержант. Назад в СССР. Книга 3

Гаусс Максим
3. Второй шанс
Фантастика:
альтернативная история
6.40
рейтинг книги
Мл. сержант. Назад в СССР. Книга 3

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

An ordinary sex life

Астердис
Любовные романы:
современные любовные романы
love action
5.00
рейтинг книги
An ordinary sex life

Том 11. Рассказы. Очерки. Публицистика. 1894-1909

Твен Марк
Проза:
классическая проза
5.00
рейтинг книги
Том 11. Рассказы. Очерки. Публицистика. 1894-1909

Кодекс Охотника. Книга VIII

Винокуров Юрий
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII

Воронцов. Перезагрузка

Тарасов Ник
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Воронцов. Перезагрузка