Int main()
{
char block[1024];
int in, out;
int nread;
in = open("file.in", O_RDONLY);
out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
while((nread = read(in, block, sizeof(block))) > 0)
write(out, block, nread);
exit(0);
}
Результат выполнения программы копирования файла (рис.3):
Рис. 3 Программа копирования файла
Другие системные вызовы для управления файлами
Существует ряд других системных вызовов, оперирующих низкоуровневыми дескрипторами файлов. Они позволяют программе контролировать использование файла, возвращая информацию о его состоянии.
lseek
Системный вызов lseek задает указатель текущей позиции чтения/записи дескриптора файла, т.е. вы можете применять его для установки в файле места, с которого будет происходить следующее считывание или на которое будет производиться следующая запись. Вы можете задать указатель на абсолютную позицию файла или позицию, относительно текущего положения указателя или конца файла.
#include <unistd.h>
#include <sys/types.h>
off_t lseek(int fildes, off_t offset, int whence);
Параметр offset применяется для указания позиции, а параметр whence определяет способ применения offset и может принимать следующие значения:
SEEK_SET — offset задает абсолютную позицию;
SEEK_CUR — offset задается относительно текущей позиции;
SEEK_END — offset задается относительно конца файла.
Вызов lseek возвращает величину параметра offset в байтах, измеряемую от начала файла, для которого установлен указатель, или -1 в случае неудачного завершения. Тип данных off_t – зависящий от реализации тип integer (целое), определенный в файле sys/types.h.
Fstat, stat и lstat
Системный вызов fstat возвращает информацию о состоянии файла, ассоциированного с открытым дескриптором файла. Эта информация записывается в структуру buf, адрес которой передается как параметр.
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int fstat(int fildes, struct stat *buf);
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
Родственные функции stat и lstat возвращают информацию о состоянии названного файла. Они возвращают те же результаты за исключением того, что файл является символической ссылкой. Вызов lstat возвращает данные о самой ссылке, а вызов stat — о файле, на который ссылка указывает.
Элементы вызываемой структуры stat могут меняться в разных UNIX-подобных системах, но обязательно включают перечисленные в табл. 3 элементы.
Таблица 3
Элемент структуры stat |
Описание |
st_mode |
Права доступа к файлу и сведения о типе файла |
st_ino |
Индекс, ассоциированный с файлом |
st_dev |
Устройство, на котором размещен файл |
st_uid |
Идентификатор (user identity) владельца файла |
st_gid |
Идентификатор группы (group identity) владельца файла |
st_atime |
Время последнего обращения |
st_ctime |
Время последнего изменения прав доступа, владельца, группы или объема |
st_mtime |
Время последней модификации содержимого |
st_nlink |
Количество жестких ссылок на файл |
У флагов st_mode, возвращаемых в структуре stat, есть ряд ассоциированных макросов в заголовочном файле sys/stat.h. В эти макросы включены имена флагов для прав доступа и типов файлов и некоторые маски, помогающие проверять специфические типы и права.
Флаги прав доступа такие же, как в системном вызове open, описанном ранее. Для флагов типов файла включены следующие имена:
S_IFBLK — блочное устройство;
S_IFDIR — каталог;
S_IFCHR — символьное устройство;
S_IFIFO — FIFO (именованный канал);
S_IFREG — обычный файл;
S_IFLNK — символическая ссылка.
Для других флагов режима файла включены следующие имена:
S_ISUID — элемент получает setUID при выполнении;
S_ISGUID — элемент получает setGID при выполнении.
Для масок, интерпретирующих флаги st_mode, включены следующие имена:
S_IFMT — тип файла;
S_IRWXU — права пользователя на чтение/запись/выполнение;
S_IRWXG — права группы на чтение/запись/выполнение;
S_IRWXO — права остальных на чтение/запись/выполнение.
Существует ряд макросов, помогающих определить типы файлов. Они просто сравнивают надлежащим образом установленные флаги режима файла с подходящим флагом, типа устройства. К ним относятся следующие:
S_ISBLK — проверка для блочного файла;
S_ISCHR — проверка для символьного файла;
S_ISDIR — проверка для каталога;
S_ISFIFO — проверка для FIFO;
S_ISREG — проверка для обычного файла;
S_ISLNK — проверка для символической ссылки.
dup и dup2
Системные вызовы dup позволяют дублировать дескриптор файла, предоставляя два или несколько разных дескрипторов, обращающихся к одному и тому же файлу. Эта возможность может применяться для чтения и записи в разные части файла. Системный вызов dup дублирует файловый дескриптор fildes и возвращает новый дескриптор. Системный вызов dup2 умело копирует один дескриптор файла в другой, задавая дескриптор, применяемый для копии.
#include <unistd.h>
int dup(int fildes);
int dup2(int fildes, int fildes2);
Эти вызовы могут оказаться полезными в случае нескольких процессов, взаимодействующих через именованные каналы.
Пример программы с использованием функций lseek, dup и fstat:
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>