Unix: komunikacja mi edzyprocesowa
|
|
- Bartosz Leśniak
- 8 lat temu
- Przeglądów:
Transkrypt
1 Unix: komunikacja mi edzyprocesowa Witold Paluszyński witold/ Copyright c Witold Paluszyński All rights reserved. Niniejszy dokument zawiera materia ly do wyk ladu na temat programowania komunikacji mi edzyprocesowej w systemie Unix. Jest on udost epniony pod warunkiem wykorzystania wy lacznie do w lasnych, prywatnych potrzeb i może być kopiowany wy lacznie w ca lości, razem z niniejsza strona tytu low a.
2
3 Komunikacja mi edzyprocesowa potoki Potoki sa jednym z najbardziej podstawowych mechanizmów komunikacji mi edzyprocesowej w systemach uniksowych. Potok jest urzadzeniem komunikacji szeregowej, jednokierunkowej, o nast epuj acych w lasnościach: na potoku można wykonywać tylko operacje odczytu i zapisu, funkcjami read i write, jak dla zwyk lych plików, potoki sa dost epne i widoczne w postaci jednego lub dwóch deskryptorów plików, oddzielnie dla końca zapisu i odczytu, potok ma określona pojemność, i w granicach tej pojemności można zapisywać do niego dane bez odczytywania, próba odczytu danych z pustego potoku, jak również zapisu ponad pojemność potoku, powoduje zawiśni ecie operacji I/O (normalnie), i jej automatyczna kontynuacj e gdy jest to możliwe; w ten sposób potok synchronizuje operacje I/O na nim wykonywane. Dobra analogia potoku jest rurka, gdzie strumień danych jest odbierany jednym końcem, a wprowadzany drugim. Gdy rurka si e zape lni i dane nie sa odbierane, nie można już wi ecej ich wprowadzić. Komunikacja mi edzyprocesowa potoki 3
4 Potoki: funkcja pipe Funkcja pipe tworzy tzw. anonimowy potok, dost epny w postaci dwóch otwartych i gotowych do pracy deskryptorów: #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #define KOM "Komunikat dla rodzica.\n" int main() { int potok_fd[2], licz, status; char bufor[bufsiz]; pipe(potok_fd); if (fork() == 0) { write(potok_fd[1], KOM, strlen(kom)); exit(0); close(potok_fd[1]); /* wazne */ while ((licz=read(potok_fd[0], bufor, BUFSIZ)) > 0) write(1, bufor, licz); wait(&status); return(status); Funkcja read zwraca 0 na próbie odczytu z potoku zamkni etego do zapisu, lecz jeśli jakiś proces w systemie ma ten potok otwarty do zapisu to funkcja read zawisa na próbie odczytu. Komunikacja mi edzyprocesowa potoki 4
5 Potoki: zasady użycia Potok (anonimowy) zostaje zawsze utworzony otwarty, i gotowy do zapisu i odczytu. Próba odczytania z potoku wi ekszej liczby bajtów, niż si e w nim aktualnie znajduje, powoduje przeczytanie dost epnej liczby bajtów i zwrócenie w funkcji read() liczby bajtów rzeczywiście przeczytanych. Próba czytania z pustego potoku, którego koniec piszacy jest nadal otwarty przez jakiś proces, powoduje zawiśni ecie funkcji read(), i powrót gdy jakieś dane pojawia si e w potoku. Czytanie z potoku, którego koniec piszacy zosta l zamkni ety, daje natychmiastowy powrót funkcji read() z wartościa 0. Zapis do potoku odbywa si e poprawnie i bez czekania pod warunkiem, że nie przekracza pojemności potoku; w przeciwnym wypadku write() zawisa aż do ukończenia operacji. Próba zapisu na potoku, którego koniec czytajacy zosta l zamkni ety, kończy si e porażka i proces piszacy otrzymuje sygna l SIGPIPE. Implementacja potoków w wi ekszości wspó lczesnych systemów uniksowych zapewnia komunikacj e dwukierunkowa. Jednak standard POSIX jednoznacznie określa potoki jako jednokierunkowe. Komunikacja mi edzyprocesowa potoki 5
6 Potoki: manipulacja deskryptorami #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { int potok_fd[2], licz; char bufor[bufsiz]; pipe(potok_fd); if (fork() == 0) { /* podproces tylko piszacy */ close(1); /* zamykamy stdout prawdziwy */ dup(potok_fd[1]); /* odzyskujemy fd 1 w potoku */ close(potok_fd[1]); /* dla porzadku */ close(potok_fd[0]); /* dla porzadku */ close(0); /* dla porzadku */ execlp("ps","ps","-fu",getenv("logname"),null); close(potok_fd[1]); /* wazne */ while ((licz=read(potok_fd[0], bufor, BUFSIZ)) > 0) write(1, bufor, licz); Komunikacja mi edzyprocesowa potoki 6
7 Potoki: komunikacja dwukierunkowa rodzic #include <stdio.h> #include <unistd.h> #include <stdlib.h> #define OK 0 #define BLAD -1 main(int argc, char *argv[]) { int pipein[2], pipeout[2]; int liczba, wynik, ntest, i; char znak, line[40]; printf("uwaga, rodzic startuje...\n"); if (pipe(pipein) == BLAD pipe(pipeout) == BLAD) { fprintf(stderr, "*** Blad pipe\n"); exit(1); switch (fork()) { case BLAD: fprintf(stderr, "*** Blad fork\n"); exit(1); case OK: if (close(0) == BLAD) { fprintf(stderr, "*** Blad close(0)\n"); exit(1); Komunikacja mi edzyprocesowa potoki 7
8 if (dup(pipeout[0]) == BLAD) { fprintf(stderr, "*** Blad dup(pipeout[0]\n"); exit(1); if (close(1) == BLAD) { fprintf(stderr, "*** Blad close(1)\n"); exit(1); if (dup(pipein[1]) == BLAD) { fprintf(stderr, "*** Blad dup(pipein[1]\n"); exit(1); if ((close(pipeout[0]) == BLAD) (close(pipeout[1]) == BLAD) (close(pipein[0]) == BLAD) (close(pipein[1]) == BLAD)) { fprintf(stderr, "*** Blad close(pipein/out[0/1])\n"); exit(1); execlp("slave", "slave", NULL); fprintf(stderr, "*** Blad execlp(slave)\n"); exit(1); printf("no, potomek splodzony, rodzic kontynuuje...\n"); if ((close(pipeout[0]) == BLAD) (close(pipein[1]) == BLAD)) { fprintf(stderr, "*** Blad close(pipein[0/1])\n"); Komunikacja mi edzyprocesowa potoki 8
9 exit(1); srand(1994); for (ntest=0; ntest<100; ntest++) { liczba = rand(); sprintf(line, "%38d", liczba); line[38] = \n ; line[39] = \0 ; printf("wysylamy komunikat: %s\n", line); if (write(pipeout[1], line, 39) == BLAD) { fprintf(stderr, "*** Blad write(pipeout[1]): %s\n", line); exit(1); printf("dane wyslane, teraz czekamy na wyniki\n"); for (i=0;i<40;i++) line[i]= ; if (read(pipein[0],line,40) == BLAD) { fprintf(stderr, "*** Blad read(pipein[0]): %s\n", line); exit(1); sscanf(line, "%d", &wynik); printf("wartosc otrzymana z podprocesu: %d\n", wynik); if (close(pipeout[1]) == BLAD close(pipein[0]) == BLAD) { fprintf(stderr, "*** Blad close(pipeout[1]/pipein[0])\n"); exit(1); return(1); Komunikacja mi edzyprocesowa potoki 9
10 Potoki: komunikacja dwukierunkowa potomek #include <stdio.h> main() { char line[81]; int xliczba; while (gets(line)!= NULL) { sscanf(line,"%d\n",&xliczba); printf("%d\n",xliczba*xliczba); Komunikacja mi edzyprocesowa potoki 10
11 Potoki nazwane (FIFO) istnieja trwale w systemie plików (mknod potok p) wymagaja otwarcia O_RDONLY lub O_WRONLY zawisaja na próbie otwarcia nieotwartego potoku (możliwe jest tylko jednoczesne otwarcie do odczytu i zapisu, przez dwa różne procesy) SERWER: #include <fcntl.h> #define FIFO "/tmp/potok_1" #define MESS \ "To jest komunikat serwera\n" void main() { int potok_fd; KLIENT: #include <fcntl.h> #define FIFO "/tmp/potok_1" void main() { int potok_fd, licz; char bufor[bufsiz]; potok_fd = open(fifo, O_WRONLY); write(potok_fd, MESS, sizeof MESS); potok_fd = open(fifo, O_RDONLY); while ((licz=read(potok_fd, bufor, BUFSIZ)) > 0) write(1, bufor, licz); Komunikacja mi edzyprocesowa potoki 11
12 Operacje na FIFO Pierwszy proces otwierajacy FIFO zawisa na operacji otwarcia, która kończy si e gdy FIFO zostanie otwarte przez inny proces w komplementarnym trybie (O_RDONLY/O_WRONLY). Można wymusić nieblokowanie funkcji open() opcja O_NONBLOCK lub O_NDELAY, lecz takie otwarcie w przypadku O_WRONLY zwraca b lad. Próba odczytu z pustego FIFO w ogólnym przypadku zawisa gdy FIFO jest otwarte przez inny proces do zapisu, lub zwraca 0 gdy FIFO nie jest otwarte do zapisu przez żaden inny proces. To domyślne zachowanie można zmodyfikować ustawiajac flagi O_NDELAY i/lub O_NONBLOCK przy otwieraniu FIFO. RTFM. W przypadku zapisu zachowanie funkcji write nie zależy od stanu otwarcia FIFO przez inne procesy, lecz od zape lnienia buforów. Ogólnie zapisy krótkie moga si e zakończyć lub zawisnać gdy FIFO jest pe lne, przy czym możemy wymusić niezawisanie podajac opcje O_NDELAY lub O_NONBLOCK przy otwieraniu FIFO. Oddzielna kwestia jest, że d luższe zapisy do FIFO ( PIPE_BUF bajtów) moga mieszać si e z zapisami z innych procesów. Komunikacja mi edzyprocesowa potoki 12
13 Gniazdka domeny Unix: funkcja socketpair W najprostszym przypadku gniazdka domeny Unix pozwalaja na realizacj e komunikacji podobnej do anonimowych potoków. Funkcja socketpair tworzy par e gniazdek po laczonych podobnie jak funkcja pipe tworzy potok. Jednak gniazdka zawsze zapewniaja komunikacj e dwukierunkowa: #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { int gniazdka[2]; char buf[bufsiz]; socketpair(pf_unix, SOCK_STREAM, 0, gniazdka) if (fork() == 0) { /* potomek */ close(gniazdka[1]); write(gniazdka[0], "Uszanowanie dla rodzica", 23); read(gniazdka[0], buf, BUFSIZ) printf("potomek odczytal: %s\n", buf); close(gniazdka[0]); else { /* rodzic */ close(gniazdka[0]); read(gniazdka[1], buf, BUFSIZ) printf("rodzic odczytal %s\n", buf); write(gniazdka[1], "Pozdrowienia dla potomka", 24); close(gniazdka[1]); Komunikacja mi edzyprocesowa gniazdka 13
14 Gniazdka domeny Unix: wprowadzenie Gniazdka sa deskryptorami plików umożliwiajacymi dwukierunkowa komunikacj e w konwencji po laczeniowej (strumień bajtów) lub bezpo laczeniowej (przesy lanie pakietów), w ramach jednego systemu lub przez sieć komputerowa, np. protoko lami Internetu. Model po laczeniowy dla gniazdek domeny Unix dzia la podobnie jak komunikacja przez potoki, m.in. system synchronizuje prac e komunikujacych si e procesów. Stosowanie modelu bezpo laczeniowego w komunikacji mi edzyprocesowej nie jest odporne na przepe lnienie buforów w przypadku procesów pracujacych z różna szybkościa; w takim przypadku lepsze jest zastosowanie modelu po laczeniowego, w którym komunikacja automatycznie synchronizuje procesy. W komunikacji mi edzyprocesowej (gniazdka domeny Unix) adresy określane sa przez ścieżki plików na dysku komputera, co umożliwia og loszenie adresu serwera. W ogólnym przypadku (wyjawszy pary gniazdek po laczonych funkcja socketpair) komunikowanie si e za pomoca gniazdek wymaga utworzenia i wype lnienia struktury adresowej. Komunikacja mi edzyprocesowa gniazdka 14
15 Gniazdka SOCK STREAM: serwer #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/un.h> #include <sys/socket.h> int main() { int serv_sock, cli_sock; struct sockaddr_un addr_str; serv_sock = socket(pf_unix, SOCK_STREAM, 0); addr_str.sun_family = AF_UNIX; strcpy(addr_str.sun_path, "gniazdko_serwera"); unlink("gniazdko_serwera"); bind(serv_sock, (struct sockaddr *) &addr_str, sizeof(addr_str)); listen(serv_sock, 5); /* kolejkowanie polaczen */ while(1) { /* petla oczek.na polaczenie */ char buf; cli_sock = accept(serv_sock,0,0); /* polacz.zamiast adr.klienta*/ read(cli_sock, &buf, 1); /* obsluga klienta: */ buf++; /*... generujemy odpowiedz */ write(cli_sock, &buf, 1); /*... wysylamy */ close(cli_sock); /*... koniec */ Komunikacja mi edzyprocesowa gniazdka 15
16 Gniazdka SOCK STREAM: klient #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/un.h> #include <sys/socket.h> int main() { int sock; struct sockaddr_un addr_str; char buf = A ; sock = socket(pf_unix, SOCK_STREAM, 0); addr_str.sun_family = AF_UNIX; strcpy(addr_str.sun_path, "gniazdko_serwera"); if (connect(sock, (struct sockaddr *) &addr_str, sizeof(addr_str)) == -1){ perror("blad connect"); return -1; write(sock, &buf, 1); read(sock, &buf, 1); printf("znak od serwera = %c\n", buf); close(sock); return 0; Komunikacja mi edzyprocesowa gniazdka 16
17 Gniazdka SOCK DGRAM: klient #include <unistd.h> #include <string.h> #include <sys/un.h> #include <sys/socket.h> int main() { int sock, serv_len, cli_len; struct sockaddr_un serv_addrstr, cli_addrstr; char ch = A ; unlink("gniazdko_klienta"); sock = socket(pf_unix, SOCK_DGRAM, 0); cli_addrstr.sun_family = AF_UNIX; strcpy(cli_addrstr.sun_path, "gniazdko_klienta"); cli_len = sizeof(cli_addrstr); bind(sock, (struct sockaddr *) &cli_addrstr, cli_len); serv_addrstr.sun_family = AF_UNIX; strcpy(serv_addrstr.sun_path, "gniazdko_serwera"); serv_len = sizeof(serv_addrstr); sendto(sock, &ch, 1, 0, (struct sockaddr *) &serv_addrstr, serv_len); if (recvfrom(sock, &ch, 1, 0, 0, 0) == -1) perror("blad recvfrom"); else printf("znak od serwera = %c\n", ch); return 0; Komunikacja mi edzyprocesowa gniazdka 17
18 Gniazdka SOCK DGRAM: serwer #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/un.h> #include <sys/socket.h> int main() { int sock, serv_len, cli_len; struct sockaddr_un serv_addrstr, cli_addrstr; sock = socket(pf_unix, SOCK_DGRAM, 0); serv_addrstr.sun_family = AF_UNIX; strcpy(serv_addrstr.sun_path,"gniazdko_serwera"); unlink("gniazdko_serwera"); serv_len = sizeof(serv_addrstr); bind(sock,(struct sockaddr *)&serv_addrstr,serv_len); while(1) { /* petla oczek.na pakiet */ char ch; cli_len = sizeof(cli_addrstr); recvfrom(sock, &ch, 1, 0, (struct sockaddr *) &cli_addrstr, &cli_len); ch++; sendto(sock, &ch, 1, 0, (struct sockaddr *) &cli_addrstr, cli_len); Komunikacja mi edzyprocesowa gniazdka 18
19 Gniazdka inne warianty komunikacji W przypadku komunikacji po laczeniowej (gniazdka typu SOCK_STREAM) umożliwia to serwerowi zwiazanie gniazdka z jakimś rozpoznawalnym adresem (funkcja bind), dzi eki czemu serwer może zadeklarować swój adres i oczekiwać na po laczenia, a klient może podejmować próby nawiazania po laczenia z serwerem (funkcja connect). W przypadku komunikacji bezpo laczeniowej (gniazdka typu SOCK_DGRAM) pozwala to skierować pakiet we w laściwym kierunku (adres odbiorcy w funkcji sendto), jak również zwiazać gniazdko procesu z jego adresem (bind), co ma skutek opatrzenia każdego wysy lanego pakietu adresem nadawcy. Możliwe jest również użycie funkcji connect w komunikacji bezpo laczeniowej, co jest interpretowane jako zapami etanie w gniazdku adresu odbiorcy i kierowanie do niego ca lej komunikacji zapisywanej do gniazdka, ale nie powoduje żadnego nawiazywania po laczenia. Wywo lanie funkcji close na gniazdku po laczonym powoduje rozwiazanie po laczenia, a w przypadku komunikacji bezpo laczeniowej rozwiazanie zwiazku adresu z gniazdkiem. Komunikacja mi edzyprocesowa gniazdka 19
20 Komunikacja mi edzyprocesowa gniazdka 20
21 System V IPC Urzadzenia komunikacyjne: kolejki komunikatów: koniec koniec pami eć (wspó l)dzielona: wielu wielu semafory: liczby ca lkowite Istnieja globalnie w systemie: polecenia ipcs, ipcrm. Nie sa deskryptorami plików i nie wykonuje si e na nich operacji I/O standardowymi funkcjami read/write, lecz każde urzadzenie ma swój specyficzny zbiór operacji I/O. Po utworzeniu danego urzadzenia jest ono od razu gotowe do pracy, nie jest konieczne jego otwieranie przez każdy proces pragnacy si e komunikować. (Z wyjatkiem obszarów pami eci wspólnej, które każdy proces musi jeszcze odwzorować na swoja przestrzeń adresowa.) Identyfikatory urzadzeń System V IPC (typu int) sa globalne w systemie, odmiennie niż deskryptory plików (także nie sa kolejno generowanymi ma lymi liczbami). Oznacza to, że jeden proces może użyć identyfikatora utworzonego przez inny proces. Wynika stad możliwość, celowego lub nie, wkleszczania si e w komunikacj e prowadzona przez inne procesy. Komunikacja mi edzyprocesowa System V IPC 21
22 Klucze identyfikacyjne typu key_t (również int) stanowia drugi poziom identyfikatorów pozwalajacych odwzorować dowolnie wybrany klucz liczbowy na rzeczywisty identyfikator. Wybór klucza u latwia nieco zapewnienie poprawnego użycia urzadzeń System V IPC. Uzyskiwanie dost epu do urzadzeń: int msgget(key_t key, int msgflg); int shmget(key_t key, int size, int shmflg); int semget(key_t key, int nsems, int semflg); Generacja kluczy funkcja ftok daje trzeci poziom identyfikatorów jeszcze bardziej u latwiaj acy wybór identyfikatora, choć nie rozwiazuje on problemów zwiazanych z przypadkowym dost epem przez obcy proces. key_t ftok(char* pathname, char proj); Prawa dost epu do urzadzeń: RWRWRW Konieczne jest jawne kasowanie urzadzeń funkcjami kontrolnymi. Urzadzenia komunikacyjne System V IPC istnieja trwale w pami eci systemu, ale nie sa przechowywane na dysku. Oznacza to, że istnieja nadal po zakończeniu procesu, który je utworzy l, ale znikaja bezpowrotnie przy restarcie systemu. Mechanizmy komunikacji System V IPC sa zawarte w rozszerzeniu XSI standardu POSIX. Komunikacja mi edzyprocesowa System V IPC 22
23 System V IPC kolejki komunikatów: serwer w laściwy/unikalny/prywatny identyfikator kolejki uzyskanie dost epu do kolejki, ew. jej utworzenie określenie priorytetu i treści komunikatu wys lanie komunikatu z czekaniem lub bez #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h> #define KEY ( (key_t) L ) #define MODES 0666 #define MSGLEN 80 void zakoncz(int syg) { if(msgctl(msqid, IPC_RMID, (struct msqid_ds *)0) < 0) printf("nie moge usunac kolejki komunikatow!\n"); exit(2); Komunikacja mi edzyprocesowa System V IPC: kolejki komunikatów 23
24 int main() { int msqid, n; struct mbuf { long mtype; char mtext[msglen]; msg; if ((msqid=msgget(key, MODES IPC_CREAT)) < 0 ) { printf("nie moge utworzyc kolejki komunikatow!\n"); exit(1); signal(sigint, zakoncz); while (1) { sleep(1); n = msgrcv(msqid, (void *)&msg, MSGLEN, 0, IPC_NOWAIT); if (n >= 0) printf("komunikat: <%s>\n", msg.mtext); else printf("brak komunikatu: errno= %d\n", errno); Komunikacja mi edzyprocesowa System V IPC: kolejki komunikatów 24
25 System V IPC kolejki komunikatów: klient #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h> #define KEY ( (key_t) L ) #define MSGLEN 80 int main() { int msqid, n; struct mbuf{ long mtype; char mtext[msglen]; msg = {115L, "Ala ma kota"; if ((msqid=msgget(key,0)) < 0 ) { printf("brak dostepu do kolejki komunikatow!\n"); exit(1); if (msgsnd(msqid, (void *)&msg, MSGLEN, 0) < 0) printf("blad wysylania komunikatu, errno=%d\n", errno); Komunikacja mi edzyprocesowa System V IPC: kolejki komunikatów 25
26 Komunikacja mi edzyprocesowa System V IPC: kolejki komunikatów 26
27 System V IPC pami eć wspó ldzielona: serwer #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define MEM_SIZ 4096 struct wspolna_struct { int klient_zapisal; char tekst[bufsiz]; ; int main() { int shmid, pracuj = 1; void *pamiec_wspolna = (void *)0; struct wspolna_struct *wspolna; srand((unsigned int)getpid()); shmid = shmget((key_t)1234, MEM_SIZ, 0666 IPC_CREAT); if (shmid == -1) { perror("shmget padlo"); exit(errno); Komunikacja mi edzyprocesowa System V IPC: pami eć wspó ldzielona 27
28 pamiec_wspolna = shmat(shmid, (void *)0, 0); if (pamiec_wspolna == (void *)-1) { perror("shmat padlo"); exit(errno); wspolna = (struct wspolna_struct *)pamiec_wspolna; wspolna->klient_zapisal = 0; while(pracuj) { if (wspolna->klient_zapisal) { printf("otrzymalem: %s", wspolna->tekst); sleep( rand() % 4 ); /* niech troche poczeka */ wspolna->klient_zapisal = 0; if (strncmp(wspolna->tekst, "koniec", 6) == 0) pracuj = 0; sleep(1); if (shmdt(pamiec_wspolna) == -1) { perror("shmdt padlo"); exit(errno); if (shmctl(shmid, IPC_RMID, 0) == -1) { perror("shmctl(ipc_rmid) padlo"); exit(errno); exit(0); Komunikacja mi edzyprocesowa System V IPC: pami eć wspó ldzielona 28
29 System V IPC pami eć wspó ldzielona: klient #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define MEM_SIZ 4096 struct wspolna_struct { int klient_zapisal; char tekst[bufsiz]; ; int main() { int pracuj = 1; void *pamiec_wspolna = (void *)0; struct wspolna_struct *wspolna; char bufor[bufsiz]; int shmid; shmid = shmget((key_t)1234, MEM_SIZ, 0666 IPC_CREAT); if (shmid == -1) { perror("shmget padlo"); exit(errno); Komunikacja mi edzyprocesowa System V IPC: pami eć wspó ldzielona 29
30 pamiec_wspolna = shmat(shmid, (void *)0, 0); if (pamiec_wspolna == (void *)-1) { perror("shmat padlo"); exit(errno); wspolna = (struct wspolna_struct *)pamiec_wspolna; while(pracuj) { while(wspolna->klient_zapisal == 1) { sleep(1); printf("czekam na odczytanie...\n"); printf("podaj tekst do przeslania: "); fgets(bufor, BUFSIZ, stdin); strcpy(wspolna->tekst, bufor); wspolna->klient_zapisal = 1; if (strncmp(bufor, "koniec", 6) == 0) { pracuj = 0; if (shmdt(pamiec_wspolna) == -1) { perror("shmdt padlo"); exit(errno); exit(0); Komunikacja mi edzyprocesowa System V IPC: pami eć wspó ldzielona 30
31 Semafory: teoria W teorii semafor jest nieujemna zmienna (sem), domyślnie kontrolujac a przydzia l pewnego zasobu. Wartość zmiennej sem oznacza liczb e dost epnych jednostek zasobu. Określone sa nast epuj ace operacje na semaforze: P(sem) oznacza zaj ecie zasobu sygnalizowane zmniejszeniem wartości semafora o 1, a jeśli jego aktualna wartość jest 0 to oczekiwanie na jej zwi ekszenie, V(sem) oznacza zwolnienie zasobu sygnalizowane zwi ekszeniem wartości semafora o 1, a jeśli istnieje( a) proces(y) oczekujacy(e) na semaforze to, zamiast zwi ekszać wartość semafora, wznawiany jest jeden z tych procesów. Istotna jest niepodzielna realizacja każdej z tych operacji, tzn. każda z operacji P, V może albo zostać wykonana w ca lości, albo w ogóle nie zostać wykonana. Z tego powodu niemożliwa jest prywatna implementacja operacji semaforowych przy użyciu zmiennej globalnej przez proces pracujacy w warunkach prze laczania procesów. Przydatnym przypadkiem szczególnym jest semafor binarny, który kontroluje dost ep do zasobu na zasadzie wy l aczności. Wartość takiego semafora może wynosić 1 lub 0. Komunikacja mi edzyprocesowa System V IPC: semafory 31
32 Semafory System V IPC Implementacja semaforów System V IPC opiera si e na nast epuj acych zasadach: Semafory tworzone sa jako zbiory semaforów; w typowych przypadkach użycia wykorzystuje si e zbiory sk ladajace si e z pojedynczego semafora: semget(key, nsems, semflg); Zamiast funkcji implementujacych podstawowe operacje semaforowe, wykorzystuje si e sekwencje operacji elementarnych na poszczególnych semaforach ze zbioru. Te sekwencje system realizuje w sposób atomowy, tzn. ca la sekwencja jest zawsze wykonana niepodzielnie. Sekwencje operacji tworzone sa przez program jako tablice struktur: struct sembuf { short sem_num; short sem_op; short sem_flg; Istnieje dodatkowy mechanizm UNDO ustawienie flagi SEM_UNDO przez proces w operacjach semaforowych spowoduje odkr ecenie tych operacji w przypadku śmierci procesu. Zapewnia to zdolność kontynuacji pracy z semaforem systemu, w którym jakiś proces zgina l, lub zwyczajnie zakończy l prac e, ale nie zbilansowa l wcześniej do zera swoich operacji na semaforze. Komunikacja mi edzyprocesowa System V IPC: semafory 32
33 Semafory System V IPC operacje Operacje na semaforach realizuje funkcja semop(semid,sembufops,nops), gdzie sembufops jest wskaźnikiem do tablicy nops struktur sembuf opisujacych sekwencj e operacji semaforowych z kodami: sem_op > 0 wartość sem_op dodawana jest do wartości semafora, co odpowiada zwolnieniu pewnej ilości zasobu (przy +1 otrzymujemy operacj e V) sem_op < 0 wartość sem_op odejmowana jest od wartości semafora o ile sem_op jest mniejsza od wartości semafora; w przeciwnym wypadku operacja czeka na zwi ekszenie wartości semafora, co odpowiada próbie zaj ecia zasobu (przy 1 otrzymujemy operacj e P) sem_op == 0 operacja czeka na wyzerowanie si e semafora bez zmiany jego wartości, co odpowiada wykrywaniu wyczerpania zasobu ( zag lodzenia si e systemu), w celu podj ecia jakiejś akcji, na przyk lad przydzielenia wi ekszej ilości zasobu (ta operacja nie ma odpowiednika dla semaforów teoretycznych) Komunikacja mi edzyprocesowa System V IPC: semafory 33
34 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> Semafory System V IPC: przyk lad użycia #define SEMKEY L/*klucz semafora do blokad*/ #define PERMS 0666 static struct sembuf op_lock[2] = { 0, 0, 0, /*czekaj az sem nr 0 bedzie 0*/ 0, 1, SEM_UNDO /*wtedy zwieksz sem nr 0 o 1 */ ; static struct sembuf op_unlock[1] = { 0, -1, (IPC_NOWAIT SEM_UNDO) /*zmn.sem0 o 1,tzn.ustaw na 0*/ ; int semid = -1; /*bedzie identyfikatorem sem.*/ my_lock(int fd) { if (semid < 0) { if((semid=semget(semkey,1,ipc_creat PERMS))<0) perror("semget error"); if (semop(semid, op_lock, 2) < 0) perror("semop lock error"); my_unlock(int fd) { if(semop(semid,op_unlock,1)<0) perror("semop unlock error"); Komunikacja mi edzyprocesowa System V IPC: semafory 34
35 Semafory System V IPC operacje kontrolne Poza zwyk lymi operacjami semaforowymi wykonywanymi funkcja semop System V IPC udost epnia dodatkowe operacje, zwane kontrolnymi, wykonywanymi funkcja semctl. Do operacji wykonywanych ta funkcja należa m.in.: usunni ecie ca lego zbioru semaforów z systemu (cmnd=ipc_rmid), ustawienie określonej (np. poczatkowej) wartości semafora o danym numerze w zbiorze (cmnd=setval/setall), pobieranie aktualnych wartości semaforów ze zbioru (cmnd=getval/getall), pobieranie informacji o procesach oczekujacych na danym semaforze (cmnd=getncnt/getzcnt), jeszcze inne. Komunikacja mi edzyprocesowa System V IPC: semafory 35
36 Semafory System V IPC uwagi Semafory standardu System V IPC sa k lopotliwe w użyciu. Zwykle lepszym wyborem sa semafory nowszego standardu Posix. Komunikacja mi edzyprocesowa System V IPC: semafory 36
37 Synchronizacja dost epu do pami eci semaforami: serwer #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #define SHM_KEY ( (key_t) L ) #define R_SEM_KEY ( (key_t) L ) #define W_SEM_KEY ( (key_t) L ) #define MODES 0666 static struct sembuf sem_wait = {0, -1, 0, sem_post = {0, 1, 0; static union semun { int val; struct semid_ds *buf; unsigned short *array; sem_arg ; int main() { char *shared_mem = (char *)0; char buf[bufsiz], *charptr; Komunikacja mi edzyprocesowa System V IPC: semafory 37
38 int shmid, r_semid, w_semid; r_semid = semget(r_sem_key, 1, IPC_CREAT MODES); if (r_semid == -1) { perror("semget(\"r\") padlo"); exit(errno); w_semid = semget(w_sem_key, 1, IPC_CREAT MODES); if (w_semid == -1) { perror("semget(\"w\") padlo"); exit(errno); shmid = shmget(shm_key, BUFSIZ, IPC_CREAT MODES); if (shmid == -1) { perror("shmget padlo"); exit(errno); shared_mem = (char *)shmat(shmid, (void *)0, 0); if (shared_mem == (char *)-1) { perror("shmat padlo"); exit(errno); srand((unsigned int)getpid()); sem_arg.val = 0; /* inicjalizacja semafora */ semctl(r_semid, 0, SETVAL, sem_arg); do { Komunikacja mi edzyprocesowa System V IPC: semafory 38
39 printf("czekam na dane...\n"); if (0!=semop(r_semid, &sem_post, 1)) { /* otworz semafor gotowosci */ perror("semop(\"r\",\"post\")"); sleep( rand() % 6 ); /* troche czekamy */ if (0!=semop(w_semid, &sem_wait, 1)) { /* czekaj na zapis, potwierdz */ perror("semop(\"w\",\"wait\")"); else { printf("otrzymalem: \"%s\"\n", shared_mem); sleep( rand() % 6 ); /* znow troche poczekajmy */ while (strncmp(shared_mem, "koniec", 6)!= 0); if (shmdt(shared_mem) == -1) { perror("shmdt padlo"); exit(errno); if (shmctl(shmid, IPC_RMID, 0) == -1) { perror("shmctl(ipc_rmid) padlo"); exit(errno); if (semctl(r_semid, 0, IPC_RMID) == -1) { perror("semctl(\"r\",ipc_rmid) padlo"); exit(errno); if (semctl(w_semid, 0, IPC_RMID) == -1) { perror("semctl(\"w\",ipc_rmid) padlo"); Komunikacja mi edzyprocesowa System V IPC: semafory 39
40 exit(errno); return 0; Komunikacja mi edzyprocesowa System V IPC: semafory 40
41 Synchronizacja dost epu do pami eci semaforami: klient #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #define SHM_KEY ( (key_t) L ) #define R_SEM_KEY ( (key_t) L ) #define W_SEM_KEY ( (key_t) L ) #define MODES 0666 static struct sembuf sem_nowait = {0, -1, IPC_NOWAIT, sem_post = {0, 1, 0; const static struct timespec timeout = { 1, 0 ; /* 1sec */ int main() { char *shared_mem = (char *)0; char buf[bufsiz], *charptr; int shmid, r_semid, w_semid; r_semid = semget(r_sem_key, 1, IPC_CREAT MODES); if (r_semid == -1) { Komunikacja mi edzyprocesowa System V IPC: semafory 41
42 perror("semget(\"r\") padlo"); exit(errno); w_semid = semget(w_sem_key, 1, IPC_CREAT MODES); if (w_semid == -1) { perror("semget(\"w\") padlo"); exit(errno); shmid = shmget(shm_key, BUFSIZ, IPC_CREAT MODES); if (shmid == -1) { perror("shmget padlo"); exit(errno); shared_mem = (char *)shmat(shmid, (void *)0, 0); if (shared_mem == (char *)-1) { perror("shmat padlo"); exit(errno); do { while(0!=semop(r_semid, &sem_nowait, 1)) { printf("czekam na odczyt/gotowosc serwera.\n"); sleep(1); printf("podaj text do przeslania: "); fgets(buf, BUFSIZ, stdin); charptr = strchr(buf, \n ); Komunikacja mi edzyprocesowa System V IPC: semafory 42
43 if (NULL!=charptr) *charptr = 0; strcpy(shared_mem, buf); if (0!=semop(w_semid, &sem_post, 1)) { /* sygnalizuj zapis gotowy */ perror("semop(\"w\",\"post\")"); while (strncmp(buf, "koniec", 6)!= 0); if (shmdt(shared_mem) == -1) { perror("shmdt padlo"); exit(errno); return 0; Komunikacja mi edzyprocesowa System V IPC: semafory 43
44 Komunikacja mi edzyprocesowa System V IPC: semafory 44
45 Mechanizmy komunikacji standardu POSIX Realtime Istnieja mechanizmy komunikacji mi edzyprocesowej, analogiczne badź podobne do System V IPC, wprowadzone w rozszerzeniu realtime standardu POSIX rozszerzenia Realtime IEEE Sa to: kolejki komunikatów, pami eć wspó ldzielona, semafory. Pomimo iż ich funkcjonalność jest podobna do starszych i bardzo dobrze utrwalonych mechanizmów System V IPC, te nowe posiadaja istotne zalety, przydatne w aplikacjach czasu rzeczywistego ale nie tylko w takich. Dlatego zostana one tu przedstawione. Należy zwrócić uwag e, że nie wszystkie mechanizmy czasu rzeczywistego wprowadzone w standardzie POSIX sa tu omówione, np. nie b ed a omawiane sygna ly czasu rzeczywistego, timery, ani mechanizmy zwiazane z watkami, takie jak mutexy, zmienne warunkowe, ani blokady zapisu i odczytu. Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime 45
46 Wszystkie mechanizmy komunikacji mi edzyprocesowej tu opisywane, opieraja identyfikacj e wykorzystywanych urzadzeń komunikacji na deskryptorach plików, do których dost ep można uzyskać przez identyfikatory zbudowane identycznie jak nazwy plików. Nazwy plików musza zaczynać si e od slash-a / (co podkreśla fakt, że maja charakter globalny), jednak standard nie określa, czy te pliki musza istnieć/być tworzone w systemie, a jeśli tak to w jakiej lokalizacji. Takie rozwiazanie pozwala systemom, które moga nie posiadać systemu plików (jak np. systemy wbudowane) tworzyć urzadzenia komunikacyjne w swojej w lasnej wirtualnej przestrzeni nazw, natomiast wi ekszym systemom komputerowym na osadzenie ich w systemie plików wed lug dowolnie wybranej konwencji. Dodatkowo, semafory moga wyst epować w dwóch wariantach: anonimowe i nazwane. Jest to analogiczne do anonimowych i nazwanych potoków. Semafor anonimowy nie istnieje w sposób trwa ly, i po jego utworzeniu przez dany proces, dost ep do niego moga uzyskać tylko jego procesy potomne przez dziedziczenie. Dost ep do semaforów nazwanych uzyskuje si e przez nazwy plików, podobnie jak dla pozosta lych urzadzeń. Urzadzenia oparte o konkretna nazw e pliku zachowuja swój stan (np. kolejka komunikatów swoja zawartość, a semafor wartość) po ich zamkni eciu przez wszystkie procesy z nich korzystajace, i ponownym otwarciu. Standard nie określa jednak, czy ten stan ma być również zachowany po restarcie systemu. Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime 46
47 Kolejki komunikatów POSIX Kolejki komunikatów standardu POSIX maja nast epuj ace w lasności: kolejka jest dwukierunkowym urzadzeniem komunikacyjnym Kolejka może być otwarta w jednym z trybów: O_RDONLY, O_WRONLY, O_RDWR. sta ly rozmiar komunikatu Podobnie jak kolejki komunikatów System V IPC, a odmiennie niż potoki (anonimowe i FIFO), które sa strumieniami bajtów, kolejki przekazuja komunikaty jako ca le jednostki. priorytety komunikatów Podobnie jak komunikaty System V IPC, komunikaty POSIX posiadaja priorytety, które sa jednak inaczej wykorzystywane. Nie ma możliwości odebrania komunikatu o dowolnie określonym priorytecie, natomiast zawsze odbierany jest najstarszy komunikat o najwyższym priorytecie. Taka funkcjonalność pozwala, mi edzy innymi, uniknać typowego zjawiska inwersji priorytetów, gdzie komunikat o wysokim priorytecie może znajdować si e w kolejce za komunikatem/ami o niższym priorytecie. Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: kolejki komunikatów 47
48 blokujace lub nieblokujace odczyty Podobnie jak kolejki komunikatów System V IPC, kolejki POSIX posiadaja zdolność blokowania procesu w oczekiwaniu na komunikat gdy kolejka jest pusta, lub natychmiastowego powrotu z kodem sygnalizujacym brak komunikatu. Jednak w odróżnieniu od kolejek System V IPC, ta funkcjonalność jest dost epna dla kolejki jako takiej (wymaga jej otwarcia w trybie O_NONBLOCK) a nie dla konkretnych odczytów. powiadamianie asynchroniczne Kolejki komunikatów POSIX posiadaja dodatkowa funkcj e pozwalajac a zażadać asynchronicznego powiadomienia o nadejściu komunikatu do kolejki. Dzi eki temu proces może zajmować si e czymś innym, a w momencie nadejścia komunikatu może zostać powiadomiony przez: dor eczenie sygna lu uruchomienie określonej funkcji jako nowego watku Rejestracja asynchronicznego powiadomienia jest dopuszczalna tylko dla jednego procesu, i ma charakter jednorazowy, to znaczy, po dor eczeniu pojedynczego powiadomienia wygasa (ale może być ponownie uruchomiona). W przypadku gdy jakiś proces w systemie oczekiwa l już na komunikat w danej kolejce, asynchroniczne powiadomienie nie jest generowane. Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: kolejki komunikatów 48
49 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <mqueue.h> Kolejki komunikatów POSIX: mq receive #define MQ_TESTQUEUE "/mq_testqueue" #define MODES 0666 #define MSGLEN int main() { mqd_t mqd; int len; unsigned int pri; char msg[msglen]; // na wszelki wypadek printf("probuje usunac istniejaca kolejke komunikatow...\n"); if(mq_unlink(mq_testqueue) < 0) perror("nie moge usunac kolejki"); else printf("kolejka usunieta.\n"); Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: kolejki komunikatów 49
50 mqd = mq_open(mq_testqueue, O_RDONLY O_CREAT O_NONBLOCK, MODES, 0); if (mqd == (mqd_t)-1) { perror("mq_open"); exit(-1); else printf("kolejka komunikatow mqd = %d\n", mqd); printf("czekam na dane...\n"); do { sleep(1); len = mq_receive(mqd, msg, MSGLEN, &pri); if (len >= 0) printf("odebrany komunikat dlugosc %d: <%d,%s>\n", len, pri, msg); else perror("brak komunikatu"); while (0!=strncmp(msg, "koniec", MSGLEN)); mq_close(mqd); return 0; Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: kolejki komunikatów 50
51 Kolejki komunikatów POSIX: mq send #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <mqueue.h> #include <sys/unistd.h> #ifndef MQ_PRIO_MAX #define MQ_PRIO_MAX _SC_MQ_PRIO_MAX #endif #define MQ_TESTQUEUE "/mq_testqueue" #define MODES 0666 #define MSGLEN int main() { mqd_t mqd; unsigned int pri; char msg[msglen], buf[bufsiz], *charptr; mqd = mq_open(mq_testqueue, O_WRONLY O_CREAT O_NONBLOCK, MODES, 0); if (mqd == (mqd_t)-1) { perror("mq_open"); exit(-1); else printf("kolejka komunikatow mqd = %d\n", mqd); Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: kolejki komunikatów 51
52 do { printf("podaj tresc komunikatu: "); fflush(stdout); fgets(msg, MSGLEN, stdin); charptr = strchr(msg, \n ); if (NULL!=charptr) *charptr = 0; printf("podaj priorytet komunikatu: "); fflush(stdout); fgets(buf, BUFSIZ, stdin); sscanf(buf, "%i", &pri); if (pri<0) pri = 0; if (pri>mq_prio_max) { printf("wartosc priorytetu przekracza maksimum: %d\n", MQ_PRIO_MAX); pri = MQ_PRIO_MAX; printf("wysylany komunikat: <%d,%s>\n", pri, msg); if (mq_send(mqd, msg, strlen(msg)+1, pri) < 0) perror("blad mq_send"); else printf("poszlo mq_send.\n"); while (0!=strncmp(msg, "koniec", MSGLEN)); mq_close(mqd); return 0; Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: kolejki komunikatów 52
53 Pami eć wspó ldzielona: serwer #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <sys/types.h> #include <sys/mman.h> #define POSIX_SOURCE #define SHM_TESTMEM "/shm_testmem" #define MODES 0666 struct shared_struct { int client_wrote; char text[bufsiz]; ; int main() { struct shared_struct *shared_mem; int shmd, shared_size; // na wszelki wypadek printf("probuje usunac istniejacy obszar wspolny...\n"); if(shm_unlink(shm_testmem) < 0) perror("nie moge usunac obszaru pamieci"); else printf("obszar pamieci wspolnej usuniety.\n"); Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: pami eć wspó ldzielona 53
54 shmd = shm_open(shm_testmem, O_RDWR O_CREAT, MODES); if (shmd == -1) { perror("shm_open padlo"); exit(errno); shared_size = sizeof(struct shared_struct); ftruncate(shmd, shared_size); shared_mem = (struct shared_struct *) mmap(null,shared_size,prot_read PROT_WRITE,MAP_SHARED,shmd,0); srand((unsigned int)getpid()); shared_mem->client_wrote = 0; do { printf("czekam na dane...\n"); sleep( rand() % 4 ); /* troche czekamy */ if (shared_mem->client_wrote) { printf("otrzymalem: \"%s\"\n", shared_mem->text); sleep( rand() % 4 ); /* znow troche poczekajmy */ shared_mem->client_wrote = 0; while (strncmp(shared_mem->text, "koniec", 6)!= 0); munmap((char *)shared_mem, shared_size); return 0; Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: pami eć wspó ldzielona 54
55 Pami eć wspó ldzielona: klient #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <sys/types.h> #include <sys/mman.h> #define POSIX_SOURCE #define SHM_TESTMEM "/shm_testmem" #define MODES 0666 struct shared_struct { int client_wrote; char text[bufsiz]; ; int main() { struct shared_struct *shared_mem; char buf[bufsiz], *charptr; int shmd, shared_size; shmd = shm_open(shm_testmem, O_RDWR O_CREAT, MODES); if (shmd == -1) { perror("shm_open padlo"); exit(errno); Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: pami eć wspó ldzielona 55
56 shared_size = sizeof(struct shared_struct); ftruncate(shmd, shared_size); shared_mem = (struct shared_struct *) mmap(null,shared_size,prot_read PROT_WRITE,MAP_SHARED,shmd,0); do { while(shared_mem->client_wrote == 1) { sleep(1); printf("czekam na odczytanie...\n"); printf("podaj text do przeslania: "); fgets(buf, BUFSIZ, stdin); charptr = strchr(buf, \n ); if (NULL!=charptr) *charptr = 0; strcpy(shared_mem->text, buf); shared_mem->client_wrote = 1; while (strncmp(buf, "koniec", 6)!= 0); munmap((char *)shared_mem, shared_size); return 0; Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: pami eć wspó ldzielona 56
57 Synchronizacja dost epu do pami eci semaforami: serwer #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <semaphore.h> #include <sys/types.h> #include <sys/mman.h> #define SEM_READSEM "/sem_readsem" #define SEM_WRITESEM "/sem_writesem" #define SHM_TESTMEM "/shm_testmem" #define SHM_SIZE BUFSIZ #define MODES 0666 int main() { char *shared_mem; int shmd; sem_t *semr, *semw; // na wszelki wypadek printf("probuje usunac istniejacy semafor R...\n"); if(sem_unlink(sem_readsem) < 0) perror("nie moge usunac semafora R"); else printf("semafor R usuniety.\n"); printf("probuje usunac istniejacy semafor W...\n"); Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: semafory 57
58 if(sem_unlink(sem_writesem) < 0) perror("nie moge usunac semafora W"); else printf("semafor W usuniety.\n"); printf("probuje usunac istniejacy obszar wspolny...\n"); if(shm_unlink(shm_testmem) < 0) perror("nie moge usunac obszaru pamieci"); else printf("obszar pamieci wspolnej usuniety.\n"); semr = sem_open(sem_readsem, O_CREAT, MODES, 0); /* wstepnie zamkniety */ if (semr == SEM_FAILED) { perror("sem_open R padlo"); exit(errno); semw = sem_open(sem_writesem, O_CREAT, MODES, 1); /* wstepnie otwarty */ if (semw == SEM_FAILED) { perror("sem_open W padlo"); exit(errno); shmd = shm_open(shm_testmem, O_RDWR O_CREAT, MODES); if (shmd == -1) { perror("shm_open padlo"); exit(errno); ftruncate(shmd, SHM_SIZE); shared_mem = (char*) mmap(null, SHM_SIZE, PROT_READ, MAP_SHARED, shmd, 0); srand((unsigned int)getpid()); do { Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: semafory 58
59 printf("czekam na dane...\n"); sleep( rand() % 4 ); /* troche czekamy */ if (0!=sem_trywait(semr)) { /* proba odczytu */ perror("sem_wait R"); else { printf("otrzymalem: \"%s\"\n", shared_mem); sleep( rand() % 4 ); /* znow troche poczekajmy */ if (0!=sem_post(semw)) { /* zezwala na ponowny zapis */ perror("sem_post W"); while (strncmp(shared_mem, "koniec", 6)!= 0); munmap((char *)shared_mem, SHM_SIZE); sem_close(semr); sem_close(semw); return 0; Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: semafory 59
60 Synchronizacja dost epu do pami eci semaforami: klient #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <semaphore.h> #include <sys/types.h> #include <sys/mman.h> #define SEM_READSEM "/sem_readsem" #define SEM_WRITESEM "/sem_writesem" #define SHM_TESTMEM "/shm_testmem" #define SHM_SIZE BUFSIZ #define MODES 0666 int main() { char *shared_mem, buf[shm_size], *charptr; int shmd; sem_t *semr, *semw; semr = sem_open(sem_readsem, O_CREAT, MODES, 0); /* wstepnie zamkniety */ if (semr == SEM_FAILED) { perror("sem_open R padlo"); exit(errno); Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: semafory 60
61 semw = sem_open(sem_writesem, O_CREAT, MODES, 1); /* wstepnie otwarty */ if (semw == SEM_FAILED) { perror("sem_open W padlo"); exit(errno); shmd = shm_open(shm_testmem, O_RDWR O_CREAT, MODES); if (shmd == -1) { perror("shm_open padlo"); exit(errno); ftruncate(shmd, SHM_SIZE); shared_mem = (char*) mmap(null, SHM_SIZE, PROT_WRITE, MAP_SHARED, shmd, 0); do { while(0!=sem_trywait(semw)) { /* proba wejscia w zapis */ printf("czekam na odczytanie...\n"); sleep(1); printf("podaj text do przeslania: "); fgets(buf, SHM_SIZE, stdin); charptr = strchr(buf, \n ); if (NULL!=charptr) *charptr = 0; strcpy(shared_mem, buf); if (0!=sem_post(semr)) { /* zezwala na odczyt */ perror("sem_post R"); while (strncmp(buf, "koniec", 6)!= 0); Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: semafory 61
62 munmap((char *)shared_mem, SHM_SIZE); sem_close(semr); sem_close(semw); return 0; Komunikacja mi edzyprocesowa mechanizmy POSIX Realtime: semafory 62
Unix: komunikacja mi edzyprocesowa
Unix: komunikacja miedzyprocesowa Witold Paluszyński witold.paluszynski@pwr.edu.pl http://kcir.pwr.edu.pl/ witold/ Copyright c 1999 2013 Witold Paluszyński All rights reserved. Niniejszy dokument zawiera
Unix: komunikacja mi edzyprocesowa
Unix: komunikacja miedzyprocesowa Witold Paluszyński witold.paluszynski@pwr.edu.pl http://kcir.pwr.edu.pl/ witold/ Copyright c 1999 2013 Witold Paluszyński All rights reserved. Niniejszy dokument zawiera
Mechanizmy komunikacji i synchronizacji
Mechanizmy komunikacji i synchronizacji Witold Paluszyński Instytut Informatyki, Automatyki i Robotyki Politechnika Wroc lawska http://sequoia.iiar.pwr.wroc.pl/~witold/ 2013,2015 Ten utwór jest dostepny
Komunikacja mi edzyprocesowa (IPC)
Komunikacja miedzyprocesowa (IPC) Procesy tworzone w ramach systemu operacyjnego moga sie komunikować. Jeżeli duża aplikacja jest budowana z wielu wspó lpracuj acych procesów, to ta komunikacja może być
Procesy. w systemach operacyjnych (quasi)równoleg le wykonywanie wielu być wykonywane naprzemiennie i/lub jednocześnie.
Procesy Procesy umożliwiaja w systemach operacyjnych (quasi)równoleg le wykonywanie wielu zadań. Moga być wykonywane naprzemiennie i/lub jednocześnie. Zatem system operacyjny musi to (quasi)równoleg le
4.2 Sposób korzystania z l acza
4.2 Sposób korzystania z l acza 31 Opis programu: Program procesu potomnego (linie 16 19) jest taki sam, jak w przyk ladzie na listingu 3. W procesie macierzystym nastepuje z kolei przekierowanie standardowego
ezykach wysokiego poziomu (Dijkstra, 1965). semaphore semaphore S; Operacje na semaforze:
c Wies law P laczek 18 5 Semafory 5.1 Poj ecia ogólne Semafor pierwszymechanizmsynchronizacyjnywj ezykach wysokiego poziomu (Dijkstra 1965). semaphore semaphore S; Operacje na semaforze: abstrakcyjny typ
problemu producenta i konsumenta z ograniczonym buforem cyklicznym. Wszystkie funkcje dotyczace
37 5 Mechanizmy IPC Mechanizmy IPC (ang. Interprocess Communication) obejmuja pamieć wspó ldzielona, semafory i kolejki komunikatów. Semafory sa raczej mechanizmem synchronizacji, niż komunikacji procesów.
Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.
Przykład: $ ls more Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi. Tworzenie łącza #include int pipe(int filedes[2]); Przykład: int
IPC: Kolejki komunikatów
IPC: Kolejki komunikatów Systemy Operacyjne 2 laboratorium Mateusz Hołenko 7 listopada 2011 Plan zajęć 1 Mechanizmy IPC kolejki komunikatów pamięć współdzielona semafory 2 Kolejki komunikatów kolejka komunikat
Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach
Laboratorium Systemów Operacyjnych Ćwiczenie 4. Operacje na plikach Wykonanie operacji wymaga wskazania pliku, na którym operacja ma zostać wykonana. Plik w systemie LINUX identyfikowany jest przez nazwę,
Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)
Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi) Ćwiczenie piąte (jedne zajęcia) Temat: Semafory Opracowanie: mgr in ż. Arkadiusz Chrobot dr in ż. Grzegorz Łukawski Wprowadzenie 1. Semafory
Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011
Obsługa plików Systemy Operacyjne 2 laboratorium Mateusz Hołenko 25 września 2011 Plan zajęć 1 Pliki w systemie Linux i-węzły deskryptory plików 2 Operacje na plikach otwieranie i zamykanie zapis i odczyt
Mechanizmy z grupy IPC
Mechanizmy z grupy IPC Podobnie jak łącza, IPC (Inter Process Communication) jest grupą mechanizmów komunikacji i synchronizacji procesów działających w ramach tego samego systemu operacyjnego. W skład
Kolejki FIFO (łącza nazwane)
Kolejki FIFO (łącza nazwane) Systemy Operacyjne 2 laboratorium Mateusz Hołenko 6 listopada 2011 Plan zajęć 1 Łącza w systemie Linux kolejki FIFO vs. potoki specyfika łączy nazwanych schemat komunikacji
1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu:
6 Pamięć współdzielona 6.1 Dostęp do pamięci współdzielonej 1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu: #include #include #include #include
Gniazda BSD. komunikacja bezpołączeniowa
Gniazda BSD komunikacja bezpołączeniowa Użycie gniazd w transmisji bezpołączeniowej socket() socket() bind() bind() STOP! recv() żądanie send() send() odpowiedź recv() STOP! recvfrom() #include
Shared memory and messages. Functions. process 0. process 1. program 0. program 0. data 0. data 1. program 1. data 0. data 1.
Shared memory and messages Shared memory vs message passing Shared memory - C functions Shared memory - example program Message queues - C functions Message queues - example program process 0 process 1
Kolejki komunikatów POSIX
Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 1 Kolejki komunikatów POSIX 1 Wstęp Kolejka komunikatów Q posiada następujące własności: - Posiada określoną pojemność N komunikatów (długość bufora komunikatów).
Instytut Teleinformatyki
Instytut Teleinformatyki Wydział Inżynierii Elektrycznej i Komputerowej Politechnika Krakowska programowanie usług sieciowych IPC Systemu V laboratorium: 08 Kraków, 2014 08. Programowanie Usług Sieciowych
Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)
Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi) wiczenie trzecie Temat: Potoki i ł cza nazwane w Linuksie. Opracowanie: mgr in ż. Arkadiusz Chrobot Wprowadzenie 1. Komunikacja z wykorzystaniem
Literatura uzupełniająca: W. Richard Stevens, Programowanie zastosowań sieciowych w systemie Unix WNT 1998
Gniazda BSD Literatura uzupełniająca: W. Richard Stevens, Programowanie zastosowań sieciowych w systemie Unix WNT 1998 socket() Użycie gniazd w transmisji połączeniowej bind() listen() socket() accept()
Semafory, pamięć dzielona i kolejki komunikatów
Semafory, pamięć dzielona i kolejki komunikatów dr inż. Sławomir Samolej Katedra Informatyki i Automatyki Politechnika Rzeszowska Program przedmiotu oparto w części na materiałach opublikowanych na: http://wazniak.mimuw.edu.pl/
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Łącza nienazwane(potoki)
8. Łącza nienazwane(potoki) Łącze (potok, ang. pipe) jest to urządzenie komunikacyjne pozwalające na przesyłanie informacji w jedną stronę. Jeden proces wysyła dane do łącza za pomocą funkcji write, zaś
Pamięć dzielona i kolejki komunikatów
Pamięć dzielona i kolejki komunikatów dr inż. Sławomir Samolej Katedra Informatyki i Automatyki Politechnika Rzeszowska Program przedmiotu oparto w części na materiałach opublikowanych na: http://wazniak.mimuw.edu.pl/
Temat zajęć: Mechanizmy IPC: kolejki komunikatów.
Temat zajęć: Mechanizmy IPC: kolejki komunikatów. Czas realizacji zajęć: 90 min. Zakres materiału, jaki zostanie zrealizowany podczas zajęć: Tworzenie kolejek komunikatów, wysyłanie i odbieranie komunikatów,
Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)
Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi) Ćwiczenie trzecie (jedne zajęcia) Temat: Potoki i łącza nazwane w Linuksie. Opracowanie: dr in ż. Arkadiusz Chrobot Wprowadzenie 1. Komunikacja
1. Kolejki komunikatów POSIX
Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 1 1. Kolejki komunikatów POSIX 1.1 Podstawowe własności Kolejki FIFO maja następujące wady: Komunikaty pozbawione struktury Nie można testować stanu kolejki
SYSTEMY CZASU RZECZYWISTEGO - VxWorks
WZAJEMNE WYKLUCZANIE Wiele metod. Np. wyłączanie przerwań: funkcja() //... Int blokada = intlock(); // Obszar krytyczny, któremu nie możemy przerwać intunlock(blokada); wyłączanie wywłaszczania: funkcja()
Systemy Operacyjne Ćwiczenia
Systemy Operacyjne Ćwiczenia Wies law P laczek Wydzia l Fizyki, Astronomii i Informatyki Stosowanej, Uniwersytet Jagielloński ul. Reymonta 4, 30-059 Kraków 4 lutego 2009 Streszczenie Praca ta zawiera materia
Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:
Pliki W celu wykonania jakiejkolwiek operacji na istniejącym pliku, plik ten musi zostać otwarty, natomiast jeśli plik jeszcze nie istnieje, to musi zostać utworzony. Plik może zostać otwarty w trybie:
Komunikacja za pomocą potoków. Tomasz Borzyszkowski
Komunikacja za pomocą potoków Tomasz Borzyszkowski Wstęp Sygnały, omówione wcześniej, są użyteczne w sytuacjach błędnych lub innych wyjątkowych stanach programu, jednak nie nadają się do przekazywania
J. Ułasiewicz Programowanie aplikacji współbieżnych 1
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 9. Komunikacja przez pamięć dzieloną Metoda komunikacji przez wspólną pamięć może być użyta gdy procesy wykonywane są na maszynie jednoprocesorowej
Krótki kurs programowania współbieżnego (2)
Krótki kurs programowania współbieżnego (2) Procesy i sygnały w języku C (to było ostatnio) Wspólny dostęp do plików (to też) Semafory i pamięć dzielona Inne metody komunikowania Kurs systemu UNIX 1 Dzielenie
13. Kolejki komunikatów POSIX
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 13. POSIX 13.1 Wstęp (mailboxy, bufory) są bardzo popularnym mechanizmem komunikacji międzyprocesowej. Występują w prawie każdym systemie operacyjnym.
Programowanie Współbieżne. W Linuxie/Unixie
Programowanie Współbieżne W Linuxie/Unixie Komunikacja p r o c e s u ż y t k o w n i k a 1 p r o c e s u ż y t k o w n i k a 2 J ą d r o s y s t e m u Komunikacja p r o c e s u ż y t k o w n i k a 1 p
Pamięć współdzielona
Pamięć współdzielona Systemy Operacyjne 2 Piotr Zierhoffer 17 listopada 2011 Mechanizmy IPC IPC Inter Process Communication kolejki komunikatów, pamięć współdzielona semafory polecenia bash: ipcs, ipcrm
Temat zajęć: Mechanizmy IPC: semafory
Temat zajęć: Mechanizmy IPC: semafory Czas realizacji zajęć: 90 min. Zakres materiału, jaki zostanie zrealizowany podczas zajęć: Zasada działania semaforów binarnych i uogólnionych, tworzenie semaforów,
Mechanizmy z grupy IPC
Mechanizmy z grupy IPC Podobnie jak łącza, IPC (Inter Process Communication) jest grupą mechanizmów komunikacji i synchronizacji procesów działających w ramach tego samego systemu operacyjnego. W skład
sposób wykonywania operacji zapisu i odczytu dane odczytywane z l acza usuwane (nie można ich odczytać ponownie),
27 4 L acza L acza w systemie UNIX sa plikami specjalnymi, s luż acymi do komunikacji pomiedzy procesami. L acza maja kilka cech typowych dla plików zwyk lych, czyli posiadaja swój i-weze l, posiadaja
3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);
3.1. Określanie adresu połączonego hosta 3. #include int getpeername(int socket, struct sockaddr *addr, int *addrlen); Funkcja getpeername dostarcza adresu drugiej strony połączenia. Parametry:
Systemy Operacyjne 1 Laboratorium 3 Potoki i łącza nazwane w Linuksie (jeden tydzień) dr inż. Arkadiusz Chrobot
Systemy Operacyjne 1 Laboratorium 3 Potoki i łącza nazwane w Linuksie (jeden tydzień) dr inż. Arkadiusz Chrobot 15 października 2016 Wstęp W tej instrukcji zawarte są informacje na temat jednych z podstawowych
Funkcje zawarte w bibliotece < io.h >
PLIKOWE OPERACJE WEJŚCIA - WYJŚCIA Język C/C++ nie ma wbudowanych żadnych instrukcji umożliwiających wykonywanie operacji wejścia-wyjścia! Służą do tego funkcje biblioteczne. Funkcje zawarte w bibliotece
KOLEJKI KOMUNIKATÓW IPC
z przedmiotu, prowadzonych na Wydziale BMiI, Akademii Techniczno-Humanistycznej w Bielsku-Białej. Współbieżność procesów (czy wątków) wiąże się często z potrzebą okresowej (asynchronicznej) wymiany komunikatów.
aodczytywać zniegoza pomoc afunkcjiread, (niebuforowane funkcje wejścia/wyjścia). e sukcesem, to zwróci liczb, erzeczywiściezapisanychbajtów.
c Wies law P laczek 15 4 Potoki 4.1 Wprowadzenie Potok (ang. pipe) możnauznaćzaplikspecjalnegotypuktórys lużydoprzechowywania ograniczonej ilości danych i do którego dost ep może si eodbywaćjedyniewtrybie
Temat zajęć: Obsługa łączy komunikacyjnych
Temat zajęć: Obsługa łączy komunikacyjnych Czas realizacji zajęć: 180 min. Zakres materiału, jaki zostanie zrealizowany podczas zajęć: I. Łącza komunikacyjne Potoki nienazwane, potoki nazwane, przykłady
SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)
Program my_ping: wysłanie komunikatu ICMP z żądaniem echa Struktura icmp (plik netinet/ip_icmp.h) 0 7 8 15 16 31 TYP (icmp_type) KOD (icmp_code) IDENTYFIKATOR (icmp_id) SUMA KONTROLNA (icmp_cksum) NUMER
Wstęp do programowania 1
Wstęp do programowania 1 Struktury Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 12 Struktura dla dat - przykład #include struct Date { int y; short m; short
Krótkie wprowadzenie do korzystania z OpenSSL
Krótkie wprowadzenie do korzystania z OpenSSL Literatura: http://www.openssl.org E. Rescola, "An introduction to OpenSSL Programming (PartI)" (http://www.linuxjournal.com/article/4822) "An introduction
Programowanie Sieciowe 1
Programowanie Sieciowe 1 dr inż. Tomasz Jaworski tjaworski@iis.p.lodz.pl http://tjaworski.iis.p.lodz.pl/ Klient UDP Kolejność wykonywania funkcji gniazdowych klienta UDP Protokół UDP jest bezpołączeniowy:
Gniazda UDP. Bartłomiej Świercz. Łódź, 3 kwietnia Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda UDP
Gniazda UDP Bartłomiej Świercz Katedra Mikroelektroniki i Technik Informatycznych Łódź, 3 kwietnia 2006 Wstęp ZewzględunaróżnicewprotokołachTCPiUDPsposób korzystania z gniazd UDP różni sie znacznie od
Funkcje systemu Unix
Funkcje systemu Unix Witold Paluszyński witold@ict.pwr.wroc.pl http://sequoia.ict.pwr.wroc.pl/ witold/ Copyright c 2002 2005 Witold Paluszyński All rights reserved. Niniejszy dokument zawiera materia ly
Funkcje zawarte w bibliotece < io.h >
PLIKOWE OPERACJE WEJŚCIA - WYJŚCIA Język C/C++ nie ma wbudowanych żadnych instrukcji umożliwiających wykonywanie operacji wejścia-wyjścia! Służą do tego funkcje biblioteczne. Funkcje zawarte w bibliotece
Obsługa plików Procesy
Obsługa plików Procesy Systemy Operacyjne 2 laboratorium Mateusz Hołenko 15 października 2011 Plan zajęć 1 Obsługa plików 1 Pliki w systemie Linux i-węzły deskryptory plików 2 Operacje na plikach 3 Operacje
PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO
PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO LABORATORIUM Temat: QNX Neutrino Interrupts Mariusz Rudnicki 2016 Wstęp W QNX Neutrino wszystkie przerwania sprzętowe przechwytywane są przez jądro systemu. Obsługę
Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.
Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411b Plan wykładu Operacje wejścia-wyjścia Dostęp do plików Struktury
Laboratorium z systemów operacyjnych. System plików - funkcje systemowe. Anna Wojak
Laboratorium z systemów operacyjnych System plików - funkcje systemowe Anna Wojak 1 Zagadnienia do samodzielnego przygotowania: podstawowe polecenia linux, podstawy programowania w jezyku C, deskryptor
1.1 Przykład znajdowanie liczb pierwszych leżących w zadanym zakresie, tryb bezpołączeniowy
1.1 Przykład znajdowanie liczb pierwszych leżących w zadanym zakresie, tryb bezpołączeniowy Należy znaleźć liczby pierwsze w zakresie od 2 do N na P komputerach. Zarządca pocz[i], kon[i] wykonawca 1 wykonawca
Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła
Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła Wydział Inżynierii Mechanicznej i Informatyki Instytut Informatyki Teoretycznej i Stosowanej
Programowanie Współbieżne. Komunikacja między procesowa IPC
Programowanie Współbieżne Komunikacja między procesowa IPC IPC W systemie V są 3 rodzaje komunikacji między procesowej. kolejki komunikatów semafory pamięć wspólna IPC plik nagłówkowy funkcja systemowa
Ghost in the machine
Operacje na pami eci i odrobina I/O Zak lad Chemii Teoretycznej UJ 8 stycznia 2007 Funkcje operujace Wstep do operacji I/O na plikach 1 Operacje na pami eci 2 Funkcje operujace 3 Wst Funkcje operujace
Programowanie Proceduralne
Programowanie Proceduralne Struktury Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 10 Co dziś będzie: Definiowanie struktury Deklarowanie zmiennych bȩda cych strukturami
10. Synchronizacja użycia zasobów, Semafory Problem producenta i konsumenta
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 10. użycia zasobów, Semafory 10.1 Problem producenta i konsumenta Zagadnienie kontroli użycia jednostek zasobu W systemie istnieje pula N jednostek
Klient-Serwer Komunikacja przy pomocy gniazd
II Klient-Serwer Komunikacja przy pomocy gniazd Gniazda pozwalają na efektywną wymianę danych pomiędzy procesami w systemie rozproszonym. Proces klienta Proces serwera gniazdko gniazdko protokół transportu
Unix: programowanie procesów
Unix: programowanie procesów Witold Paluszyński witold.paluszynski@pwr.wroc.pl http://sequoia.ict.pwr.wroc.pl/ witold/ Copyright c 1999 2013 Witold Paluszyński All rights reserved. Niniejszy dokument zawiera
Laboratorium Podstawy Przetwarzania Rozproszonego SPRAWOZDANIE z zadania SERWIS KOMPUTEROWY
Laboratorium Podstawy Przetwarzania Rozproszonego SPRAWOZDANIE z zadania SERWIS KOMPUTEROWY Nazwisko Imię album termin zajęć Marek Lewandowski 59817 Maciej Mietliński 59832 poniedziałek 18:30 tydzień nieparzysty
Systemy Operacyjne - Operacje na plikach
Systemy Operacyjne - Operacje na plikach Andrzej Stroiński Institute of Computer Science Poznań University of Technology 1 październik, 2012 Wprowadzenie do ANSI-C Pomoc systemowa man gcc man 2 write man
Temat zajęć: Obsługa systemu plików.
Temat zajęć: Obsługa systemu plików. Czas realizacji zajęć: 90 min. Zakres materiału, jaki zostanie zrealizowany podczas zajęć: I. Operacje na plikach zwykłych. Tworzenie i otwieranie plików, deskryptory
Programowanie przy użyciu gniazdek
Programowanie przy użyciu gniazdek Gniazdo (ang. socket) pojęcie abstrakcyjne reprezentujące dwukierunkowy punkt końcowy połączenia. Dwukierunkowość oznacza możliwość wysyłania i przyjmowania danych. Wykorzystywane
Rys. 9-1 Procesy P1 i P2 komunikuję się poprzez wspólny obszar. pamięci.
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 9. Komunikacja przez pamięć dzieloną Metoda komunikacji przez wspólną pamięć może być użyta gdy procesy wykonywane są na maszynie jednoprocesorowej
1. Kolejki komunikatów POSIX
Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 1 1. Kolejki komunikatów POSIX 1.1 Podstawowe własności Kolejki FIFO maja następujące wady: Komunikaty pozbawione struktury Nie można testować stanu kolejki
5. Model komunikujących się procesów, komunikaty
Jędrzej Ułasiewicz str. 1 5. Model komunikujących się procesów, komunikaty Obecnie stosuje się następujące modele przetwarzania: Model procesów i komunikatów Model procesów komunikujących się poprzez pamięć
Unix: programowanie z użyciem w atków
Unix: programowanie z użyciem w atków Witold Paluszyński witold.paluszynski@pwr.wroc.pl http://sequoia.ict.pwr.wroc.pl/ witold/ Copyright c 1999 2006 Witold Paluszyński All rights reserved. Niniejszy dokument
Unix: programowanie z użyciem w atków
Unix: programowanie z użyciem w atków Witold Paluszyński witold.paluszynski@pwr.wroc.pl http://sequoia.ict.pwr.wroc.pl/ witold/ Copyright c 1999 2006 Witold Paluszyński All rights reserved. Niniejszy dokument
eć dzielona standardu POSIX
c Wies law P laczek 25 6 Pami eć dzielona standardu POSIX 6.1 Wprowadzenie Pami eć dzielona inaczej wspólna (ang. shared memory) jestzasobemumożliwiaj acym najszybszy sposób komunikacji mi edzy procesami
Biblioteka standardowa - operacje wejścia/wyjścia
Biblioteka standardowa - operacje wejścia/wyjścia Przemysław Gawroński D-10, p. 234 Wykład 6 15 stycznia 2019 (Wykład 6) Biblioteka standardowa - operacje wejścia/wyjścia 15 stycznia 2019 1 / 14 Outline
Pobieranie argumentów wiersza polecenia
Pobieranie argumentów wiersza polecenia 2. Argumenty wiersza polecenia Lista argumentów Lista argumentów zawiera cały wiersz poleceń, łącznie z nazwą programu i wszystkimi dostarczonymi argumentami. Przykłady:
2 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 2 1/7 Język C Instrukcja laboratoryjna Temat: Wprowadzenie do języka C 2 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do języka C. Język C jest językiem programowania ogólnego zastosowania
Unix: programowanie procesów
Unix: programowanie procesów Witold Paluszyński witold.paluszynski@pwr.edu.pl http://kcir.pwr.edu.pl/ witold/ Copyright c 1999 2018 Witold Paluszyński All rights reserved. Niniejszy dokument zawiera materia
Instytut Teleinformatyki
Instytut Teleinformatyki Wydział Inżynierii Elektrycznej i Komputerowej Politechnika Krakowska programowanie usług sieciowych Dziedzina Unix laboratorium: 06 Kraków, 2014 06. Programowanie Usług Sieciowych
Unix: programowanie procesów
Unix: programowanie procesów Witold Paluszyński witold.paluszynski@pwr.edu.pl http://kcir.pwr.edu.pl/ witold/ Copyright c 1999 2018 Witold Paluszyński All rights reserved. Niniejszy dokument zawiera materia
Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego
Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego 1 /24 Pisanie pojedynczych znaków z klawiatury do pliku #include void main(void) { FILE *fptr; // wkaznik do pliku, tzw. uchwyt
Paradygmaty programowania. Paradygmaty programowania
Paradygmaty programowania Paradygmaty programowania Dr inż. Andrzej Grosser Cz estochowa, 2013 2 Spis treści 1. Zadanie 2 5 1.1. Wprowadzenie.................................. 5 1.2. Wskazówki do zadania..............................
Zaawansowane operacje wejścia/wyjścia
Zaawansowane operacje wejścia/wyjścia Witold Paluszyński witold.paluszynski@pwr.wroc.pl http://sequoia.ict.pwr.wroc.pl/ witold/ Copyright c 2002 2003 Witold Paluszyński All rights reserved. Niniejszy dokument
Tablice i funkcje. Marcin Makowski. 26 listopada Zak lad Chemii Teoretycznej UJ
Zak lad Chemii Teoretycznej UJ 26 listopada 2007 wielowymiarowe 1 2 wielowymiarowe 3 Typ tablicowy Plan wielowymiarowe Tablica Zajmujacy spójny obszar w pamieci zestaw zmiennych (obiektów) tego samego
J. Ułasiewicz Łącza nienazwane, nazwane, select 1
J. Ułasiewicz Łącza nienazwane, nazwane, select 1 4. Komunikacja pomiędzy procesami przez łącza nienazwane i nazwane Łącza nienazwane (ang. Unnamed Pipes) i nazwane (ang. Unnamed Pipes) - jedna z historycznie
Temat zajęć: Tworzenie i obsługa wątków.
Temat zajęć: Tworzenie i obsługa wątków. Czas realizacji zajęć: 180 min. Zakres materiału, jaki zostanie zrealizowany podczas zajęć: Tworzenie wątków, przekazywanie parametrów do funkcji wątków i pobieranie
Podstawy programowania w języku C++
Podstawy programowania w języku C++ Część jedenasta Przetwarzanie plików amorficznych Konwencja języka C Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie
przypadków wywo lanie systemowe (funkcja systemowa) lub funkcja biblioteczna zwraca wartość 1(czasamiNULL) iprzypisujezmiennej zewn etrznej,
c Wies law P laczek 3 1 Obs luga b l edów Wwi ekszości przypadków wywo lanie systemowe (funkcja systemowa) lub funkcja biblioteczna kończ ac si e b l edem zwraca 1(czasamiNULL) iprzypisujezmiennej zewn
4. Komunikacja pomiędzy procesami przez łącza nienazwane i nazwane
Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 1 4. Komunikacja pomiędzy procesami przez łącza nienazwane i nazwane Łącza nienazwane (ang. Unnamed Pipes) i nazwane (ang. Named Pipes) - jedna
Funkcje. Piotr Zierhoffer. 7 października Institute of Computer Science Poznań University of Technology
Funkcje Piotr Zierhoffer Institute of Computer Science Poznań University of Technology 7 października 2012 Funkcje Funkcja podprogram. Nazwany blok kodu realizujacy jakieś zadanie. sin(x), arccos(x), min(a,
Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)
Wykład 7 Abstrakcyjne typy danych słownik (lista symboli) Definicja słownika: Słownik (tablica lub lista symboli) to struktura danych zawierająca elementy z kluczami, która pozwala na przeprowadzanie dwóch
Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011
Procesy Systemy Operacyjne 2 laboratorium Mateusz Hołenko 9 października 2011 Plan zajęć 1 Procesy w systemie Linux proces procesy macierzyste i potomne procesy zombie i sieroty 2 Funkcje systemowe pobieranie
Uzupełnienie dot. przekazywania argumentów
Uzupełnienie dot. przekazywania argumentów #include #include struct nowa { int f; char line[20000]; int k; } reprezentant; int main() { void funkcja7( struct nowa x); reprezentant.k=17;
przerwany proces móg l zareagować na określone zdarzenie. Można je traktować jako software owe wersje przerwań sprz etowych.
c Wies law P laczek 9 3 Sygna ly 3.1 Opis sygna lów Najprostsz ametod akomunikacjimi edzyprocesowej w systenie UNIX s sygna ly. Umożliwiaj aoneasynchroniczne przerwanie dzia lania procesu przez inny proces
2. Interfejs gniazd. 2.1. Gniazdo
2. 2.1. Gniazdo Gniazdo (ang. socket): pewna abstrakcja wykorzystywana do wysyłania lub otrzymywania danych z innych procesów. Pełni rolę punktu końcowego w linii komunikacyjnej. to interfejs między programem
1. Procesy i współbieżność
1. Procesy i współbieżność Opracował: Sławomir Samolej Politechnika Rzeszowska, Katedra Informatyki i Automatyki, Rzeszów, 2013. 1.1. Wprowadzenie Proces to przestrzeń adresowa i pojedynczy wątek sterujący,
Wykład 1
Wstęp do programowania 1 Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 1 Wprowadzenie Cel wykładów z programowania proceduralnego Wykład jest poświęcony językowi C i jego
Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal
Instrukcja wyboru, pętle 2 wykład. Podstawy programowania - Paskal Tematy Instrukcja wyboru jeden z wielu wariantów: case Pętle while repeat for Instrukcje sterowania pętli break continue goto Instrukcja