Простая программа sendfile, но не работает - PullRequest
0 голосов
/ 05 октября 2011
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/sendfile.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
    int fd1,fd2,rc;
    off_t offset = 0;
    struct stat stat_buf;

    fd1=open("./hello.txt",O_RDONLY); //read only
    fd2=open("../",O_RDWR);           //both read and write
    fstat(fd1, &stat_buf);            //get the size of hello.txt
    printf("file size: %d\n",(int)stat_buf.st_size);
    rc=sendfile (fd2, fd1, &offset, stat_buf.st_size);
}

Итак, как вы видели, это довольно простая программа. Но я просто не могу найти hello.txt в ../ Моя цель - посмотреть, что произойдет, если я поставлю любое число, скажем 10, вместо st_size, которое может быть сотнями байтов.

Edit:

Спасибо за ваши ответы. Ну, я последовал твоему совету и изменил

 fd2=open("../",O_RDWR);

до

 fd2=open("../hello.txt",O_RDWR);

Также я проверил возвращаемое значение fstat и sendfile, все в порядке.

Но проблема все та же.

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Вы пробовали fd2 = open("../hello.txt",O_RDWR);?

2 голосов
/ 05 октября 2011

Вам необходимо указать имя файла во втором open, а не только имя каталога.

Обязательно проверьте возвращаемые значения всех этих функций, включая fstat.

0 голосов
/ 05 октября 2011

1>

  fd1=open("./hello.txt",O_RDONLY); //read only
  fd2=open("../",O_RDWR);           //both read and write

заменить на

 fd1=open("../hello.txt",O_RDONLY); //read only
  fd2=open("../your_file_name",O_RDWR);         

2>

 fstat(fd1, &stat_buf); 

заполнит некоторую информацию, связанную с файлом fd1 в stat_buf. Здесь размер этого файла также возвращается в этой структуре с элементом st_size.

сейчас в

 rc=sendfile (fd2, fd1, &offset, stat_buf.st_size);

Всего байтов stat_buf.st_size будет отправлено в файл fd2. если здесь, если вы напишите 10, то в fd2 будет только 10 байтов.

...