2013-03-12 12 views
9

Mam gniazdo robię select() na nim, czekając na inny proces do zapisu. Po zapisaniu odczytuję dane i zapisuję je w innym deskryptorze pliku. Moje pytanie brzmi: czy istnieje sposób na połączenie gniazda z deskryptorem pliku, więc kiedy są gotowe dane, zostanie on automatycznie zapisany do drugiego deskryptora pliku?mostkowanie między dwoma deskryptorami plików

W ten sposób mogę rzucić sposób na bufor, którego używam, i pominąć wątek w systemie.

+1

dlaczego potrzebujesz teraz wątku? – hyde

+0

Czy możesz opisać, jaki problem próbujesz rozwiązać? Rury robią dokładnie to, co chcesz, tylko z określonych strumieni. Czy Twój problem dotyczy sieci? –

+0

@MichaelFoukarakis Zajmuję się tworzeniem środowiska logowania dla demona ze starszym kodem. Nie mogę zmienić implementacji, w każdym razie, rury działają tylko w tym samym kontekście procesu, co nie działa dla mnie. – stdcall

Odpowiedz

4

Przepraszam, jeśli źle zrozumiałem twoją sytuację, ale czy masz na myśli coś takiego jak sendfile?

sendfile - transfer danych między deskryptorów

#include <sys/sendfile.h> 
ssize_t sendfile(int out_fd, int in_fd, off_t * offset ", size_t" " count"); 

sendfile() kopie danych między deskryptora i innym. Ponieważ kopiowanie odbywa się w jądrze, funkcja sendfile() jest wydajniejsza niż kombinacja read (2) i write (2), co wymagałoby przeniesienia danych do iz przestrzeni użytkownika.

+0

+1, myślę, że tego właśnie chce. – StarPinkER

+4

Fragment z połączonej strony podręcznika: * Argument in_fd musi odpowiadać plikowi obsługującemu operacje podobne do mmap (2) (tzn. Nie może być gniazdem). * – hyde

+0

Z mojego doświadczenia wynika, że ​​sendfile jest dużo szybszy ... –

6

W systemie Linux, użycie splice() może być bardziej odpowiednie, gdy kierunek jest z gniazda do pliku. Korzystanie z splice() jest nieco bardziej skomplikowane, ale otrzymujesz obie strony. Ponadto, myślę, że sendfile używa splice internally w tych dniach.

Istnieje wiele pytań na temat SO, które omawiają różnice między splice() i sendfile(). Wyszukiwanie w Internecie ujawnia również sprzeczne stwierdzenia dotyczące tego, do czego służy połączenie (źródła i miejsca docelowe). Najlepszym sposobem sprawdzenia, czy jest odpowiedni dla twojego przypadku, jest przetestowanie go.

więc około wspierane systemy plików: Which file systems support splicing via Linux's splice(2)?

SO o starych jąder nie wspierających splice dla gniazd TCP: Does Linux's splice(2) work when splicing from a TCP socket?

Splice wyjaśnił: http://kerneltrap.org/node/6505

źródło Splice: http://lxr.linux.no/#linux+v3.8.2/fs/splice.c

Powiązane problemy