/* Простой пример копирования файлов с помощью sendfile(2). порядок использования: fastcp Copyright (C) 2003 Jeff Tranter. Это программное обеспечение может свободно распространяться и/или изменяться в соответствии с условиями GNU General Public License версии 2 или более поздней, опубликованной Free Software Foundation. Это программное обеспечение распространяется в надежде, что оно будет вам полезно, но БЕЗ КАКИХ ЛИБО ГАРАНТИЙ. За пояснениями обращайтесь к тексту GNU General Public License. Вместе с данным программным обеспечением должен распространяться текст GNU General Public License, если это не так -- сообщите в Free Software Foundation, Inc., по адресу 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include int main (int argc, char** argv) { int src; /* дескриптор исходного файла */ int dest; /* дескриптор файла назначения */ struct stat stat_buf; /* сведения об исходном файле */ off_t offset = 0; /* смещение от начала исходного файла */ int rc; /* код возврата из sendfile */ /* проверить наличие двух аргументов командной строки */ if (argc != 3) { fprintf(stderr, "порядок использования: %s \n", argv[0]); exit(1); } /* проверить -- существует ли исходный файл и открыть его */ src = open(argv[1], O_RDONLY); if (src == -1) { fprintf(stderr, "не могу открыть '%s': %s\n", argv[1], strerror(errno)); exit(1); } /* запросить размер исходного файла и права доступа к нему */ fstat(src, &stat_buf); /* открыть файл назначения */ dest = open(argv[2], O_WRONLY|O_CREAT, stat_buf.st_mode); if (dest == -1) { fprintf(stderr, "не могу открыть '%s': %s\n", argv[2], strerror(errno)); exit(1); } /* скопировать файл */ rc = sendfile (dest, src, &offset, stat_buf.st_size); if (rc == -1) { fprintf(stderr, "ошибка в sendfile: %s\n", strerror(errno)); exit(1); } if (rc != stat_buf.st_size) { fprintf(stderr, "файл не удалось передать полностью: передано %d из %d байт\n", rc, (int)stat_buf.st_size); exit(1); } /* закрыть файлы и выйти */ close(dest); close(src); return 0; }