PB173 - Binární programování Linux XI. Komunikace mezi procesy, část 1 Jiri Slabý ITI, Fakulta informatiky 3. 12. 2013 J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 1 /21 Komunikace mezi procesy • Alespoň 2 procesy, které chtějí komunikovat • Dnes • Roura (pipe) • Sdílená paměť (mmap) • Plná meziprocesová komunikace (IPC) a Příště • Netlink • RPC J. Slabý (ITI, Fl) Část I Roury J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 3/21 Roury • Jednosměrná komunikace • Jádro při f ork kopíruje deskriptory • Vytvoření: pipe o Vrací pole 2 deskriptorů (+ návratovou hodnotu) • Jeden pro potomka, druhý pro rodiče • Provede se f ork o Zavřou se nepotřebné deskriptory • Čte se z prvního deskriptoru (read) o Zapisuje se do druhého deskriptoru (write) • popen=pipe+fork+exec J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 4/21 Úkol Vytvoření „echa" přes roury O Vytvořte si 2 roury Pro obousměrnou komunikaci Q Proveďte f ork Q Zavřete nepotřebné deskriptory O V jednom procesu v cyklu o několika iteracích: • Do jednoho f d zapisujte měnící se text a Např. char buf [10] = "Hello"; a (*buf)++; • Z druhého f d čtěte a vypisujte 0 V druhém procesu (echo): • Čtěte z prvního f d • A zapisujte to do druhého f d O Spusťte J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 5/21 Pojmenovaná roura • Soubor na disku • mknod a Demo J. Slabý (ITI, Fl) Část II Sdílená paměť J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 7/21 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_ANDNYMDUS | MAP_SHARED • Provede se fork • Paměť se může libovolně měnit • Ale pozor na optimalizace překladače • volatile J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 8/21 Vytvoření sdílené paměti O Vytvořte si mapování Q 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 0 Spusťte Část III IPC J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 10/21 IPC • Plná meziprocesová komunikace • Sdílená paměť • Zprávy • Semafory • Výpis: ipcs • Dokumentace: man 5 ipc J. Slabý (ITI, Fl) IPC a klíče • IPC pracuje s klíči (key_t) • Vytvoření: ftok • Cesta k existujícímu uzlu • Nějaký znak • Např. ftokO ) J. Slabý (ITI, Fl) Sekce 1 Sdílená paměť J. Slabý (ITI, Fl) PBI73/07 3. 12. 2013 13/21 Sdílená paměť (IPC) « Vytvoření: shmget • Parametr ipc_creat • Logický OR s právy • Získaní adresy: shmat • Navrácení adresy: shmďt • Další operace: shmcti • Informace: shm_stat • Zrušení: ipc_rmid 0 . . . J. Slabý (ITI, Fl) PB173/07 3.12.2013 14/21 Úkol Vytvoření sdílené paměti (IPC) 0 Vytvořte si klíč (f tok) • A vypište ho 0 Vytvořte si sdílený segment (shmget) 0 Získejte adresu (shmat) O Nyní si zkopírujte tento main do dvou souborů 0 V jednom souboru v cyklu o několika iteracích: • Zapisujte do paměti proměnný řetězec • Čekejte 100 ms 0 V druhém souboru: • Čtěte a vypište řetězec • Čekejte 100 ms 0 V obou proveďte shmďt 0 Spusťte J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 15/21 Sekce 2 Zprávy J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 16/21 Zprávy (IPC) Formát zprávy struct msgbuf { long rrrtype; • Vytvoření fronty zpráv: msgget « Odeslání zprávy: msgsnd 9 Přijetí zprávy: msgrcv • Další operace: msgcti • Informace: msg_STAT a Zrušení: ipc_rmid 9 . . . J. Slabý (ITI, Fl) PB173/07_3.12.2013 17/21 Úkol Posílání zpráv (IPC) O Vytvořte si klíč (f tok) • A vypište ho O Vytvořte si frontu zpráv (msgget) 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 J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 18/21 Sekce 3 Semafory J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 19/21 Semafory (IPC) • Meziprocesové zamykání/správa prostředků o 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 a ... Parametr semop struct sembuf { ushort sem.num; short sem.op; /* - 0 + */ short sem.flg; }; J. Slabý (ITI, Fl) PB173/07 3. 12. 2013 20/21 Úkol Práce se semaforem (IPC) O Vytvořte si klíč (f tok) • A vypište ho O Vytvořte 2 programy O Jeden tiskový server • Vytvořte si 1 semafor (semget) • Obsluhuje 5 tiskáren (shmcti a setval) a Tisk trvá 10 vteřin 0 Druhý je klient • Chce tisknout 0 Spusťte jeden server a více než 5 klientů • Do 10 vteřin J. Slabý (ITI, Fl) PB173/07 3.12.2013 21 /21