PB173 - Binární programování Linux XII. Komunikace mezi procesy Jiri Slabý Fakulta informatiky Masarykova univerzita 17. 12. 2015 Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 1 /18 Komunikace mezi procesy Alespoň 2 procesy, které chtějí komunikovat Q Roura • Pojmenovaná roura Q Sdílená paměť Q Plná meziprocesová komunikace • Sdílená paměť • Zprávy • Semafory Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 2/ 18 Sekce 1 Roura Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 3/ 18 Roury • Jednosměrná komunikace • Jádro při f ork kopíruje deskriptory • 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/05 17. 12. 2015 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 or k O Zavřete nepotřebné deskriptory O V jednom procesu v cyklu o několika iteracích: • Do f dl [i] zapisujte měnící se text • Např. char buf [10] = "Hello" ; a (*buf)++; o Zfd2[o] čtěte a vypisujte na standardní výstup 0 V druhém procesu (loopback): • Čtěte z f dl [0] • A zapisujte to do f d2 [i] O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 5/ 18 Pojmenovaná roura Soubor na disku mknod Demo Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 6/ 18 Sekce 2 Sdílená paměť Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 7/ 18 Sdílená paměť • Mapování a sdílení paměti • Jádro při fork kopíruje mapování • Vytvoření: mmap s map.anonymous 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/05 17. 12. 2015 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 o Čekejte 100 ms 0 Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 9/ 18 Sekce 3 Plná meziprocesová komunikace Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 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) PB173/05 17. 12. 2015 11/18 IPC Klíče • 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 na disku • Nějaké 8bitové nenulové číslo • Např. ftok(M.11, 'x') Jiri Slabý (Fakulta informatiky, MU) PB173/05 17.12.2015 12/ 18 • 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 Úkol Vytvoření sdílené paměti (IPC) O Vytvořte si klíč (f tok) • A vypište ho (°/.x) O Vytvořte si sdílený segment (shmget) O Získejte adresu (shmat) O Nyní si zkopírujte tento main do dvou souborů Q 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 o Čekejte 100 ms O V obou proveďte shmďt O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 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 • Odeslání zprávy: msgsnd • Přijetí zprávy: msgrcv • Další operace: msgcti • Informace: msg.stat • Zrušení: ipc rmid Jiri Slabý (Fakulta informatiky MU) PB173/05 17.12.2015 15/ 18 Úkol Posílání zpráv (IPC) O Vytvořte si klíč (f tok) • A vypište ho (°/.x) O Vytvořte si frontu zpráv (msgget) O Vytvořte si strukturu zprávy • MUSÍ Obsahovat long mtype • Přidejte char text [10] O 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 O V druhém souboru: • Čtěte frontu (msgrcv) a vypište řetězec • Čekejte 100 ms O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 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 semjlg; }; Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 17/18 Úkol Práce se semaforem (IPC) O Vytvořte si klíč (f tok) • 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) • Tisk trvá 10 vteřin O Druhý program je klientem • Chce tisknout Q Spusťte jeden server a více než 5 klientů • Do 10 vteřin Jiri Slabý (Fakulta informatiky, MU) PB173/05 17. 12. 2015 18/18