Программисты помогите...
Гость 10 октября, 2005 - 03:21
Понимаю что может не там спрашиваю, но всё же...может есть среди вас программисты? У меня генту 2004.3.
Как вы знаете, существует системный вызов
sendfile(out,in,offset,size).
Имеется програмка копирования 2-х файлов (проверка ошибок убрана).
int main(int argc, char **argv) { int src; /* дескриптор исходного файла */ int dest; /* дескриптор файла назначения */ struct stat stat_buf; /* сведения об исходном файле */ off_t offset = 0; /* смещение от начала исходного файла */ src = open(argv[1], O_RDONLY); fstat(src, &stat_buf); dest = open(argv[2], O_WRONLY|O_CREAT, stat_buf.st_mode); sendfile (dest, src, &offset, stat_buf.st_size); close(dest); close(src); }
Всё компилится без проблем:
gcc main.c -o cp
После запуска: cp main.c main.c.copy
Выскакивает ошибка на ф-ии sendfile()->errno=22(Invalid argument).
Всё перепроверил несколько раз. Забодался. Может glibc переоптимизировал :-) когда генту ставил? Больше ничего в голову не приходит. Поделитесь соображениями плиз.
»
- Для комментирования войдите или зарегистрируйтесь
Re: Программисты помогите...
В ман про EINVAL почитай. Попробуй mmap dest-файла сделать. Может он его замапить не может.
Крайне маловероятно что здесь причем-то глибцы.
1) Зачем для
1) Зачем для копирования файлов использовать sendfile? Почему бы не пользоваться read() и write()?
2) Попробуйте компилить так:
gcc -Wall -pedantic main.c -o cp
Re: 1) Зачем для
Мне sendfile нужен не для копирования файлов. Дело в том что в моей программе по сети нужно передавать файлы. Не получилось. Для теста попробовал простую програмку...
Перепробовал всё ни error-oв ни warning-ов...
Если по сети
Если по сети надо передавать, то тоже самое, - попробуйте использовать read() / write() в / из сокета. Просто я, сколько себя помню, не пользовался sendfile().
Ошибки в приведенном вами фрагменте я найти не могу. А на другои компе пробовали?
read() / write() -
read() / write() - можно использовать, но есть же спец. API: sendfile() - должно же работать.
Пробовал на SUSE 9.3 - та же история :-(
_________________
Скомпилировалось? Не значит что заработает.
Еще раз повторяю прочитай man
Еще раз повторяю прочитай man.
Файл src должен быть mmap-файлом, т.е. может быть спроэцирован в память. Файловая система, на которой он расположен, должна это уметь. Если файл на удаленной тачке, то это будет не доступно.
Выход: используй read/write либо ищи другой способ, посмотри в чужих сорцах как делают