next up previous contents
Next: socketpair() Up: Funkcje pomocnicze Previous: Funkcje pomocnicze   Contents

sendfile()

Ta wygodna funkcja zostala wprowadzona dopiero w linuxach serii 2.2.x. Sluży do kopiowania danych pomiędzy deskryptorami (zarówno plików jak i gniazd), a prototyp wyglada tak (sendfile(2)):
  #include <unistd.h>
  
  int sendfile (int out_fd,int in_fd,off_t *offset,size_t count)
  
Funkcja zwraca ilość skopiowanych bajtów albo -1 (błąd).

Przypomnijmy sobie fragment kodu będącego przykładem wykorzystania SOCK_DGRAM do przesyłania plików:

   fd = open (PLIK, O_RDONLY);
   ...
   bzero (buf, sizeof (buf));
   while (read (fd, buf, sizeof (buf)) > 0)
    {
      sendto (sd, buf, strlen (buf), 0, (struct sockaddr *) &caddr, sizeof (caddr));
      bzero (buf, sizeof (buf));
    }
   close (fd);
  
Dzięki sendfile() można to skrócić do:
   off_t offset=0;  
   ...
   fd = open (PLIK, O_RDONLY);
   ...
   sendfile (sd, fd, &offset, lseek(fd, 0, SEEK_END));
   close (fd);
  
Trzeba pamiętać, że sendfile() może kopiować tylko do gniazd połączonych (nie mylić z połączeniowymi/strumieniowymi !). Dlatego też należałoby jeszcze we wspomnianym programie dokonać małej korekty, tak aby wykorzystywał on gniazda połączone (oryginalna wersja tego nie robi).



Paweł Niewiadomski
2000-10-17