Međuprocesna komunikacija (interprocess communication - IPC) predstavlja mehanizme operativnog sistema koji omogućavaju procesima da komuniciraju i dele podatke. Obično, procesi mogu da koriste IPC kao klijenti ili serveri. Klijent je proces koji zahteva uslugu od neke drugog procesa, a server je proces koji obezbeđuje zahtevanu uslugu. Jedan proces može da se ponaša i kao server i kao klijent, zavisno od situacije. Metodi za postizanje IPC su podeljeni u nekoliko kategorija:
Metod
Kratak opis
File
Podaci uskladišteni na disku ili grupisani na zahtev fajl servera, kojim mogu da pristupaju više procesa
Signal
Sistemske poruke koje jedan proces šalje drugom. Obično se ne koriste za transfer podataka već za daljinsko upravljanje partnerskim procesima
Socket
Tok podataka poslat ka drugom procesu na istom računaru ili na nekom drugom računaru. Podaci upisani preko socket-a zahtevaju formatiranje da bi sačuvali granice poruka.
Message queue
Tok podataka sličan socket-ima koji obično čuvaju granice poruka. Obično se implementiraju preko OS i omogućavaju procesima da čitaju i pišu poruke, a da nisu direktno povezani
Pipe
Jednosmerni kanal podataka. Podaci upisani na kraju cevi u kojoj se upisuju podaci operativni sistem čuva dok ih ne pročita proces sa kraja cevi za čitanje podataka.
Semaphore
Jednostavna struktura koja sinhronizuje više procesa koji koriste deljene resurse.
Shared memory
Više procesa dobijaju pristup istom bloku memorije koji se ponaša kao deljeni bafer.
Message passing
Omogućava da više procesa komuniciraju redovima za poruke i/ili kanalima kojima ne upravlja OS
Memory-mapped file
Fajl mapiran u RAM koji može direktno da menja memorijske adrese.
Redovi za poruke
Redovi za poruke se mogu opisati kao interno povezana lista u adresnom prostoru jezgra OS. Proces može da kreira nov red za poruke ili da se poveže na neki postojeći. Povezivanjem na postojeći red procesi mogu da razmenjuju informacije preko zajedničkog reda za poruke. Jednom kreiran red za poruke ne može da nestane dok se ne uništi. Svi procesi koji su koristili red mogu da završe sa radom, ali će red još uvek da postoji. Korišćenjem komande ipcs može da se proveri da li postoji neki red za poruke koji nije uništen. Red za poruke može da se uništi komandom ipcrm.
Strukture podataka koje se kreiraju unutar adresnog prostora jezgra OS i obezbeđuju realizaciju redova za poruke su:
Bafer za poruke
Struktura jezgra msg
Struktura jezgra msqid_ds
Struktura jezgra ipc_perm
Strukture podataka
Može da se posmatra kao šablon podataka za poruke. Iako programer može da definiše svoju strukturu za podatke, veoma je važno da se razume da postoji struktura podataka koja se naziva msgbuf. Ona je deklarisana u linux/msg.h:
mtype - pozitivan broj, mtext - podaci poruke. Maksimalna veličina poruke na Linux sistemima definisana je u linux/msg.h
Sve poruke unutar jednog reda za poruke se povezuju strukturom msg (linux/msg.h)
msg_next - Pokazivač ka sledećoj poruci u redu. Poruke se skladište kao jednostruko povezana lista unutar adresnog prostora jezgra OS.
msg_type - Tip poruke, dodeljen u strukturi msgbuf.
msg_spot - Pokazivač na početak tela poruke.
msg_ts - Dužina tela poruke.
Jezgro OS kreira, skladišti i održava jednu instancu strukture msqid_ds za (linux/msg.h) svaki red za poruke kreiran na sistemu.
Jezgro OS skladišti informacije o dozvolama za IPC objekte u strukturi ipc_perm (linux/msg.h)
seq -(slot usage sequence number). Svaki put kada se IPC objekat zatvori sistemskim pozivom (uništi), ova vrednost se poveća na maksimalni broj IPC objekta koji mogu da se pokrenu na sistemu.
Sistemski poziv msgget()
Red za poruke može da se kreira ili da se poveže na već postojeći funkcijom:
msgget() kao povratnu vrednost ima ID reda ako je uspešno izvedeno ili -1 ako nije (errno se postavlja na odgovarajuću vrednost). Vrednosti za errno mogu biti:
EACCESS (permission denied)
EEXIST (Queue exists, cannot create)
EIDRM (Queue is marked for deletion)
ENOENT (Queue does not exist)
ENOMEM (Not enough memory to create queue)
ENOSPC (Maximum queue limit exceeded)
Prvi argument key je jedinstveni identifikator reda za poruke, na nivou sistema, na koji hoćemo da se povežemo (ili kreiramo). Svaki proces koji hoće da se poveže na ovaj red mora da koristi isti ključ. Drugi argument msgflg, govori funkciji msgget() šta da radi sa tim redom. Ako hoćemo da kreiramo red, polje mora da sadriži IPC_CREAT bitOR uparen (|) sa dozvolama za taj red.
Ključ
Pošto je key_t u stvari long možemo da koristimo bilo koji broj. Problem nastaje ako hard-kodiramo neki broj i neki drugi nevezani proces hard-kodira isti broj ali želi drugi red za poruke. Rešenje je korišćenje funkcije koja generiše ključ kada joj se proslede dva argumenta:
path je putanja ka fajlu koji proces može da pročita,
id je neki proizvoljno izabran karakter, npr. ‘A’.
ftok() koristi informacije o navedenom fajlu i pomoću argumenta id generiše jedinstveni ključ za msgget(). Proces koji hoće da koristi isti red mora da generiše isti ključ, pa mora da prosledi iste parametre funkciji ftok().
Sistemski poziv msgsnd()
Dodaje poruku na red za poruke.
vraća 0 ako je uspešno izvedeno ili -1 ako nije. U tom slučaju errno ima vrednosti:
AGAIN (queue is full, and IPC_NOWAIT was asserted)