inter-process-comm
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Následující verze | Předchozí verze | ||
| inter-process-comm [2015/12/15 19:08] – vytvořeno djbuldog | inter-process-comm [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| - | ====== Mezi-procesová komunikace ====== | + | ====== Mezi-procesová komunikace |
| * sdílená paměť | * sdílená paměť | ||
| Řádek 8: | Řádek 8: | ||
| * POSIX_Message_Queues | * POSIX_Message_Queues | ||
| * DBus | * DBus | ||
| + | |||
| + | ===== Sdílená paměť ===== | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | * POSIX Shared Memory Operations [[http:// | ||
| + | * mmap(2) - Map a file or shared memory object into the address space. | ||
| + | * shm_open(2) - Create, or gain access to, a shared memory object. | ||
| + | * shm_unlink(2) - Destroy a shared memory object when no references to it remain open. | ||
| + | * http:// | ||
| + | * všechny procesy mají přístup do paměti ihned | ||
| + | * začíná se voláním '' | ||
| + | * pro přístup do sdílené paměti musí procesy použít stejný name... což je string, například pathname | ||
| + | |||
| + | * System V Shared Memory Functions [[http:// | ||
| + | * shmget(2) - Create a shared memory IPC object or return the ID of one. | ||
| + | * shmctl(2) - Get the status of a shared memory segment, change permissions or user IDs, or lock or unlock a segment in memory. | ||
| + | * shmat(2) - Attach a shared memory segment to the address space. | ||
| + | * shmdt(2) - Detach a shared memory segment from the address space. | ||
| + | |||
| + | ==== Zamykaní ==== | ||
| + | |||
| + | * obecně existuje zámek (mutex) nebo semafor (semaphor) | ||
| + | * mutex | ||
| + | * pouze jeden proces/ | ||
| + | * dá se říct, že je to semafor s číslem 1 | ||
| + | * slouží k serializaci přístupu | ||
| + | * semafor | ||
| + | * nastaví se počet X, kolik procesů/ | ||
| + | * slouží k omezení paralelního přístupu na max X | ||
| + | |||
| + | Existuje C++ třída mutex | ||
| + | |||
| + | POSIX semafory [[http:// | ||
| + | * pojmenované semafory | ||
| + | * identifikuje se jménem se ve tvaru "/ | ||
| + | * vytváří se jako soubor v /dev/shm s názvem " | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * nepojmenované semafory | ||
| + | * identifikuje se číslem | ||
| + | * vytváří se v paměti | ||
| + | * jako globální proměnná - mezi vlákny | ||
| + | * ve sdílené paměti - mezi procesy | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | System V Semafor [[http:// | ||
| + | * oprávnění se nastavuje 9 bitovým číslem (obdoba oprávnění u souboru), tedy například 666 | ||
| + | * '' | ||
| + | * '' | ||
| + | * semafor prý existuje, i když všechny procesy skončí!!! | ||
| + | * lze vypsat přes ipcs -s | ||
| ===== Nepojmenovaná roura ===== | ===== Nepojmenovaná roura ===== | ||
| Řádek 20: | Řádek 78: | ||
| * rouru je potřeba na konci uzavřít příkazem '' | * rouru je potřeba na konci uzavřít příkazem '' | ||
| * zapisovat lze příkazem '' | * zapisovat lze příkazem '' | ||
| + | * při čtení z roury, zavřené na druhé straně, se přečte znak EOF | ||
| + | * při zápisu do roury, zavřené na druhé straně, se generuje signál SIGPIPE (ukončí běh aplikace) | ||
| <code c> | <code c> | ||
| Řádek 32: | Řádek 92: | ||
| </ | </ | ||
| + | ==== Spojení s procesem jednosměrně ==== | ||
| + | |||
| + | * poepen | ||
| + | * pclose | ||
| + | |||
| + | ==== Spojení s procesem obousměrně ==== | ||
| + | |||
| + | * vytvořit rouru //ipipe// pro jeden směr (rodič -> potomek) | ||
| + | * vytvořit rouru //opipe// pro druhý směr (potomek -> rodič) | ||
| + | * provést fork | ||
| + | * zavřít nepoužívané deskriptory | ||
| + | * v potomkovi zavřít deskriptor pro zápis do //ipipe// | ||
| + | * v potomkovi zavřít deskriptor pro čtení do //opipe// | ||
| + | * v rodiči zavřít deskriptor pro zápis do //opipe// | ||
| + | * v rodiči zavřít deskriptor pro čtení do //ipipe// | ||
| + | * ostatní deskriptory použít pro zpracování | ||
| + | * můžeme z nich číst/ | ||
| + | * můžeme je použít jako náhradu pro stdin ('' | ||
| + | |||
| + | ==== Neblokující roura ==== | ||
| + | |||
| + | * standardně je čtení a zápis blokující | ||
| + | * pro neblokující je potřeba změnit nastavení přes syscall '' | ||
| + | <code c> | ||
| + | // set non-blocking mode | ||
| + | if (fcntl(pipe_fd, | ||
| + | fprintf(stderr," | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code c> | ||
| + | // set blocking mode | ||
| + | if (fcntl(pipe_fd, | ||
| + | fprintf(stderr," | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * chování funkcí read a write se v non-blocking režimu mění | ||
| + | * pokud nejsou žádná data ke čtení, ale roura je pořád otevřena, vrátí funkce read chybovou návratovou hodnotu (-1) a '' | ||
| + | * pro ověření, zda jsou data připravena pro zápis/ | ||
| + | |||
| + | <code c> | ||
| + | struct timeval tv; | ||
| + | fd_set rfds; | ||
| + | fd_set wfds; | ||
| + | int nfds; | ||
| + | |||
| + | // set highest pipe FD +1 | ||
| + | nfds = (pipefd[0]> | ||
| + | |||
| + | while(...) { | ||
| + | |||
| + | FD_ZERO(& | ||
| + | FD_SET(pipefd[0],& | ||
| + | |||
| + | FD_ZERO(& | ||
| + | FD_SET(pipefd[1],& | ||
| + | |||
| + | tv.tv_sec = 5; | ||
| + | tv.tv_usec = 0; | ||
| + | | ||
| + | if (select(nfds, | ||
| + | fprintf(stderr," | ||
| + | } | ||
| + | |||
| + | if (FD_ISSET(pipefd[0], | ||
| + | .. | ||
| + | // do reading | ||
| + | } | ||
| + | .. | ||
| + | } | ||
| + | </ | ||
inter-process-comm.1450202924.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
