PB173 - Binární programování Linux XII. Komunikace mezi procesy, část 2 Jiri Slabý ITI, Fakulta informatiky 10. 12. 2013 J. Slabý (ITI, Fl) PB173/07 10. 12. 2013 1 /13 Komunikace mezi procesy • Alespoň 2 procesy, které chtějí komunikovat • Minule • Roura (pipe) • Sdílená paměť (mmap) • Plná meziprocesová komunikace (IPC) • Dnes • Netlink • RPC J. Slabý (ITI, Fl) Část I Netlink J. Slabý (ITI, Fl) PB173/07 10. 12. 2013 3/ 13 Netlink • Protokol pro komunikaci s jádrem • Standardnísocket(sys/socket.h) • Ale umožňuje i komunikaci mezi procesy • Adresování: struct sockaddr_nl (linux/netlink.h) • nl_family = AF_NETLINK • ni_pid je většinou číslo procesu • Vytvoření: socket(AF_NETLINK, S0CK_RAW, NETLINK_USERSDCK) • Server • Provede bind s nastaveným sockaddr_ni.ni_pid • Potom poslouchá pomocí recv • Klient • Posílá pomocí sendto J. Slabý (ITI, Fl) PB173/07 10. 12. 2013 4/ 13 Úkol Vytvoření netlink komunikace O Vytvořte si 2 programy • Server a klient Q V serveru proveďte: • binds nastaveným sockaddr_nl.nl_pid • Vypište si nl_pid • A v cyklu recv a write na standardní výstup O V klientovi proveďte: • sendto nějakých dat • Adresu (ni_pid) si vezměte s příkazové řádky O Spusťte J. Slabý (ITI, Fl) PB173/07 10. 12. 2013 5/ 13 Část II RPC J. Slabý (ITI, Fl) PB173/07 10. 12. 2013 6/ 13 RPC « Vzdálené volání procedur • Volání funkcí přes síť (UDP nebo TCP) o Využití např. v NFS • Portmapper • Lokální služba • Mapuje číslo programu, verzi a protokol na funkce • Registrovaná čísla v/etc/rpc J. Slabý (ITI, Fl) PB173/07 10. 12. 2013 7/ 13 RPC rozhraní pro server • rpc/rpc.h, man 3 rpc • Vytvoření spojení: svctcp_create, svcudp_create • RPC_ANYSOCK « Registrace funkce: svc_register • Registruje u portmapperu pomocí pmap_set » Viditelné v rpcinf o -p • Je zvykem před tím volat pmap_unset • Volá háček dispatch • Parametr svc_req->rq_proc určuje funkcionalitu • Lze odpovědět na zprávu: svc_sendrepiy a Obslužná smyčka: svc_run J. Slabý (ITI, Fl) PB173/07_10. 12. 2013 8/ 13 Úkol Vytvoření RPC serveru O Vytvořte Si TCP spojení (svctcp_create a RPC_ANYSDCK) O Zvolte si čísla funkce a verze • Vyhněte se číslům funkcí z /etc/rpc O Zrušte stará mapování (pmap_unset) O Registrujte službu (svc_register) • V dispatch funkci proveďte výpis svc_req->rq_proc O Spusťte smyčku (svc_run) O Spusťte program • Za předpokladu, že běží portmapper J. Slabý (ITI, Fl) PB173/07 10. 12. 2013 9/ 13 RPC rozhraní pro klienta o Vytvoření spojení: clnt_create • Stroj, protokol a číslo funkce+verze • Zrušení spojení: clnt_destroy • Zavolání funkce: clnt_call 2. parametr do dispatch —>• svc_req->rq_proc o 3. a 5. parametr: kódovací funkce (zatím xdr_void) • 4. a 6. parametr: parametry vzdálené funkce (zatím null) • Timeout: čas na odpověd J. Slabý (ITI, Fl) PB173/07 10. 12. 2013 10/13 Úkol Vytvoření RPC klienta O Vytvořte si TCP spojení na localhost (cint_create) • Použijte čísla zvolená v serveru 0 Zavolejte několikrát cint_caii • S různým 2. parametrem O Spusťte program • Za předpokladu, že server běží J. Slabý (ITI, Fl) PB173/07 10. 12. 2013 11/13 RPC a parametry XDR • rpc/xdr.h, man 3 xdr • Funkce k přenositelnému zakódování dat • xdr_void • xdr_char, xdr_short, xdr_int, xdr_long • xdr_float, xdr_double • xdr_string, xdr_array «... • Klient • 3. a 5. parametr pro clnt_call • Server O V dispatch: svc_getargs J. Slabý (ITI, Fl) PBI73/07 10.12.2013 12/ 13 Úkol Předávání parametrů Q V serveru vytvořte funkci • Vezme int, vynásobí 10 a vrátí long O Z klienta zavolejte Q Spusťte program J. Slabý (ITI, Fl) PB173/07 10.12.2013 13/ 13