PB173 - Binární programování Linux XI. Komunikace mezi procesy, část 1 Jiri Slabý Fakulta informatiky Masarykova univerzita 2. 12. 2014 Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 1/18 Komunikace mezi procesy Alespoň 2 procesy, které chtějí komunikovat Dnes O Roura « Pojmenovaná roura O Sdílená paměť Q Plná meziprocesová komunikace • Sdílená paměť • Zprávy • Semafory Příště a Netlink • RPC Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 2/ 18 Sekce 1 Roura Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 3/ 18 Roury • Jednosměrná komunikace o Jádro při f ork kopíruje deskriptory a Vytvoření: pipe • Vrací pole 2 deskriptorů (+ návratovou hodnotu) • Jeden pro potomka, druhý pro rodiče • Provede se f ork • Zavřou se nepotřebné deskriptory • Čte se z prvního deskriptoru (read) • Zapisuje se do druhého deskriptoru (write) • popen=pipe+fork+exec Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 4/ 18 Úkol Vytvoření „echa" přes roury O Vytvořte si 2 roury Pro obousměrnou komunikaci • Budete mít f dl [2] afd2[2] O Proveďte f ork Q Zavřete nepotřebné deskriptory O V jednom procesu v cyklu o několika iteracích: • Do f dl [l] zapisujte měnící se text a Např. char buf [10] = "Hello"; a (*buf)++; • Z f d2 [0] čtěte a vypisujte na standardní výstup O V druhém procesu (loopback): Čtěte z f dl [0] • A zapisujte to do f d2 [l] O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 5/ 18 Pojmenovaná roura • Soubor na disku • mknod • Demo Jiri Slabý (Fakulta informatiky, MU) Sekce 2 Sdílená paměť Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 7/ 18 Sdílená paměť • Mapování a sdílení paměti 9 Jádro při fork kopíruje mapování • Vytvoření: mmap S MAP_AN0NYM0US I MAP_SHARED Provede se fork • Paměť je volně k dispozici oběma procesům • Jen pozor na optimalizace překladače • volatile Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 8/ 18 Úkol Vytvoření sdílené paměti O Vytvořte si sdílené mapování O Proveďte f ork O V jednom procesu v cyklu o několika iteracích: Zapisujte do paměti proměnný řetězec • Čekejte 100 ms O V druhém procesu: • Čtěte a vypište řetězec • Čekejte 100 ms O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 9/ 18 Sekce 3 Plná meziprocesová komunikace Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 10/18 IPC Plná meziprocesová komunikace • Sdílená paměť • Zprávy • Semafory Výpis: ipcs (Demo) Dokumentace: man 5 ipc sys/ipc.h Jiri Slabý (Fakulta informatiky, MU) a IPC pracuje s klíči (key_t) • Procesy komunikují pomocí klíče • Jen pokud mají stejný • Vytvoření klíče: f tok (sys/ipc.h) • Cesta k existujícímu uzlu • Nějaké 8bitové číslo • Např. ftok(".", >x>) IPC Sdílená paměť sys/shm.h Vytvoření: shmget • Poslední parametr ipc_creat • Logický OR s právy (0644 apod.) Získaní adresy (attach): shmat Navrácení adresy (detach): shmďt Další operace: shmcti • Informace: shm_stat • Zrušení: ipc_rmid Jiri Slabý (Fakulta informatiky, MU) Úkol Vytvoření sdílené paměti (IPC) O Vytvořte si klíč (ftok) • A vypište ho (°/.x) Q Vytvořte si sdílený segment (shmget) O Získejte adresu (shmat) O Nyní si zkopírujte tento main do dvou souborů O V jednom souboru v cyklu o několika iteracích: Zapisujte do paměti proměnný řetězec • Čekejte 100 ms O V druhém souboru: • Čtěte a vypište řetězec • Čekejte 100 ms O V obou proveďte shmďt O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 14/18 IPC Zprávy Formát zprávy ^ struct my_message { long mtype; /* set to something > 0 */ }; • sys/msg.h • Vytvoření fronty zpráv: msgget a Odeslání zprávy: msgsnd a Přijetí zprávy: msgrcv a Další operace: msgctl 9 Informace: msg_stat • Zrušení: ipc_rmid «... Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 15/18 Úkol Posílání zpráv (IPC) O Vytvořte si klíč (ftok) • A vypište ho (°/.x) O Vytvořte si frontu zpráv (msgget) 0 Vytvořte si strukturu zprávy • Musí Obsahovatlong mtype • Přidejte char text [10] 0 Nyní si zkopírujte tento main do dvou souborů O V jednom souboru v cyklu o několika iteracích: • Zapisujte do fronty (msgsnd) řetězec • Čekejte 100 ms 0 V druhém souboru: • Čtěte frontu (msgrcv) a vypište řetězec • Čekejte 100 ms 0 Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 16/18 IPC Semafory • sys/sem.h • Meziprocesové zamykání/správa prostředků • Vytvoření semaforu: semget • Změna stavu semaforu: semop • Další operace: semcti • Nastaveníiniciálníhodnoty: setval (spolu s union semun.val) • Informace: sem_stat • Zrušení: ipc_rmid «... Parametr semop struct sembuf { ushort sem_num; short sem_op; /* - 0 - - */ short sem flg; }; Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 17/18 Úkol Práce se semaforem (IPC) O Vytvořte si klíč (ftok) • A vypište ho (°/.x) O Vytvořte 2 programy O Jeden program je tiskovým serverem • Vytvořte si 1 semafor (semget) • Obsluhuje 5 tiskáren (shmcti a setval) a Tisk trvá 10 vteřin O Druhý program je klientem • Chce tisknout O Spusťte jeden server a více než 5 klientů • Do 10 vteřin Jiri Slabý (Fakulta informatiky, MU) PB173/03 2.12.2014 18/18