2009-05-26 14 views
21

W większości systemów UNIX przekazywanie otwartego pliku między procesami może być łatwo wykonane dla procesów potomnych/macierzystych przez fork(); jednak muszę udostępnić fd "po" dziecko było już rozwidlone.Przenośny sposób przekazywania deskryptora pliku między różnymi procesami

Znalazłem niektóre webpages informujące mnie, że sendmsg() może działać dla procesów arbitrażowych; ale to wydaje się bardzo zależne i złożone. portlisten wydaje się być najlepszym przykładem, jaki mogę znaleźć, ale wolę dobrą bibliotekę otoki, taką jak libevent, która ukrywa całą magię kqueue, basenu, ...

Czy ktoś wie, czy jest jakaś biblioteka (i przenośna sposób), aby to zrobić?

+0

Wyszukiwanie "Przekazywanie deskryptorów plików" w [Demistifying Unix Domain Sockets] (http://www.techdeviancy.com/uds.html) – mgalgs

Odpowiedz

12

Znalazłem (z innego pytania) dobrą bibliotekę: libancillary. To jest po prostu to, czego potrzebuję!

+1

To nie jest odpowiedź. – LtWorf

13

Najlepiej jest spróbować wysłać deskryptor pliku przez gniazdo domeny Unix. Jest to opisane w Stephens iw kilku miejscach w Internecie, ale mogę wykopać kod dla ciebie, jeśli ładnie poprosisz.

To będzie całkiem przenośne w dzisiejszych czasach; wiele rzeczy uważanych za "nieprzenośne", kiedy (takie jak mmap!) są obecnie niezwykle powszechne. Jeśli chcesz być bardziej przenośny niż "większość systemów w dzisiejszych czasach", masz przed sobą wiele interesujących problemów, ale prawdopodobnie, jeśli powiesz nam więcej o tym, co robisz i na jakich platformach pracujesz (może nie-Unixowe platformy POSIX?) możemy być w stanie pomóc.

+0

Nadal mam pytanie dotyczące korzystania z sendmsg(). Myślałem, że umieszczenie gniazda domeny jako pierwszego parametru jest wystarczające, ale wydaje mi się, że nadal muszę wypełniać msghdr.msg_name jako sockaddr_un gniazda domeny - dlaczego? w każdym razie, aby temu zapobiec? – Francis

10

Istnieje mechanizm oparty na gniazdach domen uniksowych do przesyłania deskryptorów plików (takich jak gniazda - które nie mogą być odwzorowane w pamięci) pomiędzy procesami - za pomocą wywołania systemowego sendmsg().

Możesz znaleźć więcej w Stevens (jak wspomniał Curt Sampson), a także na Wikipedia.

Można znaleźć o wiele bardziej aktualne pytanie z działającym kodem pod numerem Sending file descriptor by Linux socket.

Powiązane problemy