Программисты помогите...

Понимаю что может не там спрашиваю, но всё же...может есть среди вас программисты? У меня генту 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: Программисты помогите...

Yuriy написал(а):
Выскакивает ошибка на ф-ии sendfile()->errno=22(Invalid argument).

В ман про EINVAL почитай. Попробуй mmap dest-файла сделать. Может он его замапить не может.

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

1) Зачем для

1) Зачем для копирования файлов использовать sendfile? Почему бы не пользоваться read() и write()?
2) Попробуйте компилить так:
gcc -Wall -pedantic main.c -o cp

Re: 1) Зачем для

aluk написал(а):
...Зачем для копирования файлов использовать sendfile?

Мне sendfile нужен не для копирования файлов. Дело в том что в моей программе по сети нужно передавать файлы. Не получилось. Для теста попробовал простую програмку...

aluk написал(а):
... gcc -Wall -pedantic main.c -o cp

Перепробовал всё ни error-oв ни warning-ов...

Если по сети

Если по сети надо передавать, то тоже самое, - попробуйте использовать read() / write() в / из сокета. Просто я, сколько себя помню, не пользовался sendfile().
Ошибки в приведенном вами фрагменте я найти не могу. А на другои компе пробовали?

read() / write() -

read() / write() - можно использовать, но есть же спец. API: sendfile() - должно же работать.
Пробовал на SUSE 9.3 - та же история :-(
_________________
Скомпилировалось? Не значит что заработает.

Еще раз повторяю прочитай man

Еще раз повторяю прочитай man.
Файл src должен быть mmap-файлом, т.е. может быть спроэцирован в память. Файловая система, на которой он расположен, должна это уметь. Если файл на удаленной тачке, то это будет не доступно.

Выход: используй read/write либо ищи другой способ, посмотри в чужих сорцах как делают

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".