Uživatelské nástroje

Nástroje pro tento web


inter-process-comm

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
inter-process-comm [2016/04/19 10:48] – [Spojení s procesem obousměrně] djbuldoginter-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 (IPC) ======
  
   * sdílená paměť   * sdílená paměť
Řádek 8: Řádek 8:
   * POSIX_Message_Queues   * POSIX_Message_Queues
   * DBus   * DBus
 +
 +===== Sdílená paměť =====
 +
 +  * [[http://advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdf|výborné čtení o meziprocesorové komunikaci, sdílené paměti, semaforech....]]
 +
 +  * POSIX Shared Memory Operations [[http://menehune.opt.wfu.edu/Kokua/More_SGI/007-2478-008/sgi_html/ch03.html#id29423|1]] [[http://www.cs.cf.ac.uk/Dave/C/node27.html#SECTION002740000000000000000|2]]
 +    * 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://www3.physnet.uni-hamburg.de/physnet/Tru64-Unix/HTML/APS33DTE/DOCU_004.HTM
 +      * všechny procesy mají přístup do paměti ihned
 +      * začíná se voláním ''shm_open''
 +      * 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://menehune.opt.wfu.edu/Kokua/More_SGI/007-2478-008/sgi_html/ch03.html#id17480|1]] [[http://www.cs.cf.ac.uk/Dave/C/node27.html|2]]
 +    * 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/vlakno může vstoupit
 +    * dá se říct, že je to semafor s číslem 1
 +    * slouží k serializaci přístupu
 +  * semafor
 +    * nastaví se počet X, kolik procesů/vláken může max vstoupit
 +    * slouží k omezení paralelního přístupu na max X
 +
 +Existuje C++ třída mutex
 +
 +POSIX semafory [[http://linux.die.net/man/7/sem_overview|1]] [[http://menehune.opt.wfu.edu/Kokua/More_SGI/007-2478-008/sgi_html/ch04.html#id82695|2]]
 +  * pojmenované semafory
 +    * identifikuje se jménem se ve tvaru "/řetězec" s max délkou 251
 +    * vytváří se jako soubor v /dev/shm s názvem "sem.řetězec"
 +    * ''sem_open'' - vytváří
 +    * ''sem_close'' - ukončuje práci s
 +    * ''sem_unlink'' - úplně likviduje (poslední proces)
 +    * ''sem_post''
 +    * ''sem_wait''
 +  * 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
 +    * ''sem_init'' - vytváří
 +    * ''sem_destroy'' - volat před dealokaci paměti
 +    * ''sem_post''
 +    * ''sem_wait''
 +
 +System V Semafor [[http://menehune.opt.wfu.edu/Kokua/More_SGI/007-2478-008/sgi_html/ch04.html#id16331|1]]
 +    * oprávnění se nastavuje 9 bitovým číslem (obdoba oprávnění u souboru), tedy například 666
 +    * ''semget'' - alokuje (ve sdílené paměti) nebo získá semafor s daným id
 +    * ''semop'' - provádí operace se smaforem jako init, wait, post nebo i dealokaci
 +    * semafor prý existuje, i když všechny procesy skončí!!!
 +      * lze vypsat přes ipcs -s
  
 ===== Nepojmenovaná roura ===== ===== Nepojmenovaná roura =====
Řádek 76: Řádek 134:
  
 <code c> <code c>
-FD_ZERO(&rfds)+struct timeval tv
-FD_SET(rpipe_fd,&rfds);+fd_set rfds
 +fd_set wfds; 
 +int nfds;
  
-FD_ZERO(&wfds); +// set highest pipe FD +1  
-FD_SET(wpipe_fd,&wfds);+nfds = (pipefd[0]>pipefd[1])?pipefd[0]+1:pipefd[1]+1;
  
-if (select(nfds, &rfds, &wfds, NULL, &tv) == -1) { +while(...) {
-  fprintf(stderr,"pipe error %d\n", errno); +
-}+
  
-if (FD_ISSET(rpipe_fd, &rfds)) { +  FD_ZERO(&rfds); 
-.. +  FD_SET(pipefd[0],&rfds); 
-// do reading + 
-..+  FD_ZERO(&wfds); 
 +  FD_SET(pipefd[1],&wfds); 
 + 
 +  tv.tv_sec = 5; 
 +  tv.tv_usec = 0; 
 +             
 +  if (select(nfds, &rfds, &wfds, NULL, &tv) == -1) { 
 +    fprintf(stderr,"pipe error %d\n", errno); 
 +  } 
 + 
 +  if (FD_ISSET(pipefd[0], &rfds)) { 
 +    .. 
 +    // do reading 
 +  } 
 +  ..   
 +}
 </code> </code>
inter-process-comm.1461055709.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki