Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
3. Выполнение программы даст результат, похожий на следующий:
$ <b>TIMEPORMAT="" time ./copy_system</b>
4.67user 146.90system 2:32.57elapsed 99%CPU
...
$ <b>ls -ls file.in file.out</b>
1029 -rw-r--r-- 1 neil users 1048576 Sep 17 10:46 file.in
1029 -rw------- 1 neil users 1048576 Sep 17 10:51 file.out
Как это работает
Вы используете команду
time
TIMEFORMAT
В последние годы ОС Linux продемонстрировала огромные успехи в повышении производительности системных вызовов и файловой системы. Для сравнения аналогичный тест с применением ядра 2.6 занял чуть менее 14 секунд:
$ <b>TIMEFORMAT="" time ./copy_system</b>
2.08user 10.59system 0:13.74elapsed 92%CPU
...
Вы можете добиться лучших результатов, копируя блоки большего размера. Взгляните на модифицированную программу copy_block.c, которая копирует файл блоками в 1 Кбайт и снова использует системные вызовы.
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main() {
<i> char block[1024];</i>
int in, out;
int nread;
in = open("file.in", O_RDONLY);
out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
<i> while((nread = read(in, block, sizeof(block))) > 0)</i>
<i> write(out, block, nread);</i>
exit(0);
}
Теперь испытайте программу, но сначала удалите старый выходной файл.
$ <b>rm file.out</b>
$ <b>TIMEFORMAT="" time ./copy_block</b>
0.00user 0.02system 0:00.04elapsed 78%CPU
...
Как это работает
Теперь программа выполняется только сотые доли секунды, поскольку ей требуется около 2000 системных вызовов. Конечно, это время очень зависит от системы, но оно показывает, что системные вызовы сопряжены с поддающимися измерению издержками, поэтому их применение стоит оптимизировать.
Другие системные вызовы для управления файлами
Существует ряд других системных вызовов, оперирующих низкоуровневыми дескрипторами файлов. Они позволяют программе контролировать использование файла, возвращая информацию о его состоянии,
Системный вызов
lseek
<b>#include <unistd.h></b>
<b>#include <sys/types.h></b>
<b>off_t lseek(int fildes, off_t offset, int whence);</b>
Параметр
offset
whence
offset
□
SEEK_SET
offset
□
SEEK_CUR
offset
□
SEEK_END
offset
Вызов
lseek
offset
off_t
offset
integer
Системный вызов
fstat
buf
Далее приведена синтаксическая запись вызовов.
<b>#include <unistd.h></b>
<b>#include <sys/stat.h></b>
<b>#include <sys/types.h></b>
<b>int fstat(int fildes, struct stat *buf);</b>
<b>int stat(const char *path, struct stat *buf);</b>
<b>int lstat(const char *path, struct stat *buf);</b>
Учтите, что включение файла sys/types.h не обязательное, но мы рекомендуем включать его при использовании системных вызовов, поскольку некоторые из их определений применяют для стандартных типов псевдонимы, которые могут измениться когда-нибудь.
Родственные функции
stat
lstat
lstat
stat