Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 [ 57 ] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

Изменение меток времени

с каждым файлом связан набор из трех меток времени. Мы вкратце упоминали о них, когда говорили о том, как получить информацию о файле: это время последнего доступа, время последнего изменения и время последнего изменения индексного дескриптора. Первым двум меткам времени можно присвоить произвольные значения с помощью функции и time (которая соответствует системному вызову utime в ОС UNIX). При установке двух этих значений третья метка автоматически устанавливается в текущее время, поэтому отдельного способа для ее установки не предусмотрено.

Эти значения устанавливаются во внутреннем формате времени, а именно в количестве секунд, прощедщих после полуночи 1 января 1970 года по среднегринвичскому времени. Когда мы писали нашу книгу, эта цифра достигла 800 миллионов с небольшим. (Во внутреннем формате она представляется как 32-разрядное число без знака, и если все мы не перейдем на 64-разрядные (и более) машины, то переполнение наступит где-то в следующем столетии. У нас будут гораздо более серьезные проблемы в 2000-м году*.)

Функция utime работает аналогично функциям chmod и unlink. Она получает список имен файлов и возвращает число файлов, параметры времени которых были изменены. Вот что нужно сделать, чтобы файлы frecl и barney выглядели так, будто они изменялись в недавнем прошлом:

$atime = Smtime = 700 000 000; # некоторое время назад utime(Satime, $mtime,"fred","barney")

Никакого "разумного" значения для меток времени нет: можно сделать так, чтобы файл выглядел сколь угодно старым, или чтобы казалось, будю он был изменен в далеком будущем (это полезно, если вы пишете научно-фантастические рассказы). Вот как, например с помощью функции time (которая возвращает текущее время как метку времени UNIX) можно сделать так, чтобы казалось, будто фтл max headroom был изменен спустя 20 минут после текущего момента времени:

$when = time() + 20*60; # 20 минут с текущего момента utime($when,$when,"max headroom");

Perl-функции localtime и gmtime работают так, как в С они возвращают год, из которого вычтена цифра 1900 В 2003-м году localtime выдаст год как 103



Упражнения

Ответы к упражнениям см. в приложении А.

1. Напишите программу, которая работает как утилита гт, удаляя файлы, имена которых были заданы как аргументы командной строки при вызове программы. (Никакие опции команды гт вам для этого не понадобятся.)

Обязательно проверьте эту программу с почти пустым каталогом, чтобы случайно не удалить нужные файлы! Помните, что аргументы командной строки при запуске программы извлекаются из массива @argv.

2. Напишите программу, которая работает как утилита mv, переименовывая первый аргумент командной строки во второй аргумент. (Никакие опции команды mv вам для этого не нужны, и аргументов нужно всего два.) Можете также рассмотреть случай переименования, когда целевым объектом является каталог.

3. Напишите программу, которая работает, как In, создавая жесткую ссылку из первого аргумента командной строки на второй аргумент. (Никакие опции команды /п вам для этого не нужны, и аргументов нужно всего два.)

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

5. Если у вас есть символические ссылки, напишите программу, которая ишет в текущем каталоге все файлы, на которые есть такие ссылки, и выводит их имена и значения ссылок так, как это делает /s -I (имя -> значение). Создайте в текущем каталоге несколько символических ссылок и проверьте программу.



В этой главе:

• Испольаованпе функций system и схсс

• Исиолыюваиие ооршииых кавычек

• Исиолыюваиие процессов как дескртппоров фаичов

• Испольяование

"Г"""-- . Управление

• Сводка операции, И

процессами процессами

• Передача и прием сигналов

• Упражнения

Использование функций system и exec

Когда вы из командной строки shell задаете выполнение какой-либо команды, он обычно создает новый процесс. Этот новый процесс становится порожденным процессом shell, выполняется независимо, но в координации с последним.

Аналогичным образом Perl-программа в состоянии запускать новые процессы и может делать это, как и большинство других операций, несколькими способами.

Самый простой способ запуска нового процесса - использовать для этого функцию system. В простейшей форме эта функция передает в совершенно новый /bin/sh одну строку, которая будет выполняться как команда. По выполнении команды функция system возвращает код завершения данной команды (если все было нормально - это, как правило, 0). Вот пример того, как Perl-программа выполняет команду date с помощью shell*:

system("date");

Здесь мы не проверяем возвращаемое значение, но неудачный исход выполнения команды date вряд ли возможен.

Куда идет результат этой команды? Откуда поступают исходные данные, если они нужны команде? Хорошие вопросы, и ответы на них позволят узнать, чем отличаются разлщгные способы создания процессов.

В данном случае shell фактически не используется, поскольку Perl сам выполняет операции shell, если командная строка достаточно проста, как в данном случае



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 [ 57 ] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103