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:50] – [Neblokující roura] 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>
 +struct timeval tv;
 fd_set rfds; fd_set rfds;
 fd_set wfds; fd_set wfds;
 +int nfds;
 +
 +// set highest pipe FD +1 
 +nfds = (pipefd[0]>pipefd[1])?pipefd[0]+1:pipefd[1]+1;
  
 while(...) { while(...) {
  
   FD_ZERO(&rfds);   FD_ZERO(&rfds);
-  FD_SET(rpipe_fd,&rfds);+  FD_SET(pipefd[0],&rfds);
  
   FD_ZERO(&wfds);   FD_ZERO(&wfds);
-  FD_SET(wpipe_fd,&wfds);+  FD_SET(pipefd[1],&wfds);
  
 +  tv.tv_sec = 5;
 +  tv.tv_usec = 0;
 +            
   if (select(nfds, &rfds, &wfds, NULL, &tv) == -1) {   if (select(nfds, &rfds, &wfds, NULL, &tv) == -1) {
     fprintf(stderr,"pipe error %d\n", errno);     fprintf(stderr,"pipe error %d\n", errno);
   }   }
  
-  if (FD_ISSET(rpipe_fd, &rfds)) {+  if (FD_ISSET(pipefd[0], &rfds)) {
     ..     ..
     // do reading     // do reading
inter-process-comm.1461055830.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki