4. Komunikacja pomiędzy procesami przez łącza nienazwane i nazwane

Podobne dokumenty
J. Ułasiewicz Łącza nienazwane, nazwane, select 1

J. Ułasiewicz Łącza nienazwane, nazwane, select 1

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Kolejki FIFO (łącza nazwane)

Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)

Zwielokrotnianie wejścia wyjścia

Laboratorium z systemów operacyjnych. System plików - funkcje systemowe. Anna Wojak

Łącza nienazwane(potoki)

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Systemy Operacyjne 1 Laboratorium 3 Potoki i łącza nazwane w Linuksie (jeden tydzień) dr inż. Arkadiusz Chrobot

Kolejki komunikatów POSIX

1. Kolejki komunikatów POSIX

4.2 Sposób korzystania z l acza

Temat zajęć: Obsługa łączy komunikacyjnych

Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h >

13. Kolejki komunikatów POSIX

Obsługa plików Procesy

1. Procesy i współbieżność

Temat zajęć: Obsługa systemu plików.

5. Model komunikujących się procesów, komunikaty

sposób wykonywania operacji zapisu i odczytu dane odczytywane z l acza usuwane (nie można ich odczytać ponownie),

Metody komunikacji międzyprocesowej w systemach lokalnych i rozproszonych

1. Kolejki komunikatów POSIX

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

Serwer współbieżny połączeniowy

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Biblioteka standardowa - operacje wejścia/wyjścia

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Zaawansowane operacje wejścia/wyjścia

aodczytywać zniegoza pomoc afunkcjiread, (niebuforowane funkcje wejścia/wyjścia). e sukcesem, to zwróci liczb, erzeczywiściezapisanychbajtów.

TCP - receive buffer (queue), send buffer (queue)

Pliki. Informacje ogólne. Obsługa plików w języku C

OPERACJE NA PLIKACH. Podstawowe pojęcia:

Gniazda. S. Samolej: Gniazda 1

Krótki kurs programowania współbieżnego

Zaawansowane operacje wejścia/wyjścia

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Argumenty wywołania programu, operacje na plikach

Zaawansowane operacje wejścia/wyjścia

Programowanie w językach

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

System plików warstwa logiczna

Pliki. Informacje ogólne. Obsługa plików w języku C

Zaawansowane operacje wejścia/wyjścia

Procesy i potoki. S. Samolej: Procesy

Wykład PASCAL - Pliki tekstowe

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

Pliki. Operacje na plikach w Pascalu

4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD.

Podstawy programowania w języku C++

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

1 Obsługa interfejsu transmisji szeregowej i protokół MODBUS

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

4 Transmisja szeregowa, obsługa wyświetlacza LCD.

Programowanie sieciowe

Futex (Fast Userspace Mutex) Łukasz Białek

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

asix4 Podręcznik użytkownika CtMus04 - drajwer do wymiany danych z urządzeniami sterującymi MUS-04 firmy ELEKTORMETAL S.A.

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Programowanie w językach wysokiego poziomu

Programowanie Współbieżne. W Linuxie/Unixie

Mechanizmy z grupy IPC

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:

2. Zarządzanie procesami

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Jedrzej Ułasiewicz Komputerowe systemy sterowania 1

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

9. Problem wzajemnego wykluczania i sekcji krytycznej

J. Ułasiewicz Programowanie aplikacji współbieżnych 1

System plików. Warstwowy model systemu plików

4. Procesy pojęcia podstawowe

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Języki programowania. Karolina Mikulska-Rumińska Pokój 573, tel Konsultacje wtorek 9-10.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

PRZERWANIA. 1. Obsługa zdarzeń, odpytywanie i przerwania Obsługa zdarzeń jest jedną z kluczowych funkcji w prawie każdym systemie czasu rzeczywistego.

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Plik jest reprezentowany przez strumień znaków (bajtów) o zmiennej długości. Koniec strumienia identyfikowany jest znacznikiem końca pliku EOF.

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Pamięć współdzielona

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

Metody zawarte w klasie File: boolean createnewfile() tworzy nowy, pusty plik, ale tylko jeśli on wcześniej nie istniał. boolean delete() usuwa dany

<stdio.h> <iostram> input. FILE *stdin. std::cin output. std::cout error. FILE *stdout. FILE *stderr

Wersja dokumentacji1.01. TeleToken API

ĆWICZENIE 5. TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wykład 4. Tablice. Pliki

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Pliki, potoki, sygnały

Transkrypt:

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 z historycznie pierwszych metod komunikacji międzyprocesowej. Wywodzą się z systemu UNIX. Do implementacji komunikacji międzyprocesowej wykorzystują znaną koncepcję plików. 4.1 Niskopoziomowe funkcje dostępu do plików Niskopoziomowe funkcje dostępu do plików zapewniają dostęp do plików regularnych a także specjalnych jak: łącza nazwane nienazwane gniazdka urządzenia. Nr Funkcja Opis 1 open Otwarcie lub utworzenie pliku 2 read Odczyt z pliku 3 write Zapis do pliku 4 lseek Pozycjonowanie bieżącej pozycji pliku 5 fcntl Ustawianie i testowanie różnorodnych atrybutów pliku 6 close Zamknięcie pliku Tab. 4-1 Ważniejsze niskopoziomowe funkcje dostępu do plików Otwarcie pliku funkcja open int open(char *path,int oflag, ) path Nazwa pliku lub urządzenia oflag Tryb dostępu do pliku składa się z bitów opis w pliku nagłówkowym <fcntl.h> Funkcja powoduje otwarcie pliku lub urządzenia o nazwie wyspecyfikowanej w parametrze path. Otwarcie następuje zgodnie z trybem oflag.

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 2 Funkcja zwraca: > 0 uchwyt do pliku (ang. File handle) mała liczba typu int. - 1 gdy wystąpił błąd. O_RDONLY O_WRONLY O_RDWR O_CREAT O_NONBLOCK Tylko odczyt Tylko zapis Odczyt i zapis Utwórz plik gdy nie istnieje Gdy flaga ustawiona odczyt i zapis mogą być operacjami blokującymi Tab. 4-2 Ważniejsze tryby dostępu parametr oflag Odczyt z pliku funkcja read int read(int fdes, void *bufor, int nbytes) fdes Uchwyt do pliku zwracany przez funkcję open bufor Bufor w którym umieszczane są przeczytane bajty nbytes Liczba bajtów którą chcemy przeczytać. Funkcja powoduje odczyt z pliku identyfikowanego przez fdes, nbytes bajtów i umieszczenie ich w buforze. Funkcja zwraca: > 0 liczbę rzeczywiście przeczytanych bajtów, - 1 gdy błąd. Zapis do pliku funkcja write int write(int fdes, void *bufor, int nbytes) fdes Uchwyt do pliku zwracany przez funkcję open bufor Bufor w którym umieszczane są bajty przeznaczone do zapisu nbytes Liczba bajtów którą chcemy zapisać Funkcja powoduje zapis do pliku identyfikowanego przez fdes nbytes bajtów znajdujących buforze. Funkcja zwraca: > 0 liczbę rzeczywiście zapisanych bajtów, - 1 gdy błąd.

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 3 Zamknięcie pliku funkcja close int close(int fdes) fdes Uchwyt do pliku zwracany przez funkcję open Funkcja powoduje zamknięcie pliku identyfikowanego przez fdes. Należy ją wykonać gdy nie będą już wykonywane operacje na danym pliku. main(void) { int fd; char buf[80]; fd = open( /home/jan/mój_plik.txt,o_rdonly); do { rd = read(fd,buf,80); printf( Odczytano %d bajtów\n,rd); while(rd == 80); close(fd); Przykład 4-1 Przykład odczytu pliku tekstowego

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 4 4.2 Łącza nienazwane Łącze nienazwane (ang. Pipe) można wyobrazić sobie jako rodzaj rury bitowej łączącej dwa procesy. Łącze nienazwane implementowane jest jako bufor cykliczny. Proces P1 Proces nadający Pipe Proces P2 Proces odbierający Rys. 1 Procesy P1 i P2 komunikują się poprzez łącze nienazwane Łącze tworzy się poprzez wykonanie funkcji pipe: int pipe(int fildes[2]); fildes Tablica dwuelementowa na uchwyty plików do odczytu I zapisu Funkcja tworzy łącze nienazwane i umieszcza w tablicy fildes uchwyty plików: fildes[0] uchwyt pliku do odczytu. fildes[1] uchwyt pliku do zapisu. Funkcja zwraca: 0 sukces, -1 błąd. Do pisania i czytania z łącza używa się mechanizmu plików i standardowych funkcji read i write. Plików nie otwiera się za pomocą funkcji open. Stosownych uchwytów dostarcza funkcja pipe w tablicy fildes. write(fildes[1],...) Tablica fildes 4 5 read(fildes[0],...) Rys. 2 Użycie tablicy z uchwytami plików

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 5 Własności łącz nienazwanych: 1. Kanał jest jednokierunkowy dla danego procesu i nieużywany w tym procesie plik powinien być zamknięty. 2. Metoda komunikacji może być użyta tylko dla procesów związanych będących w relacji macierzysty / potomny. 3. Jako że łącze jest buforem typu FIFO utrzymywanym w pamięci operacyjnej ma ono ograniczoną pojemność. 4. Operacje zapisu odczytu do łącza są operacjami atomowymi. main() { int fd[2],rd,wr,i; char c; // Utworzenie łącza --------------- if (pipe(fd) < 0) { perror("łącze "); exit(10); // Utworzenie procesu potomnego --- if (fork() > 0) { // Proces macierzysty czyta z łącza close(fd[1]); do { rd = read(fd[0], &c, 1); printf( Odczyt-> %c \n,c); while(rd > 0); close(fd[0]); else { // Proces potomny pisze do łącza ----------- close(fd[0]); for(i=0;i<10;i++) { c= 0 + i; printf( Zapis-> %c \n,c); write(fd[1], &c,1); sleep(1); close(fd[1]); Przykład 4-2 Przykład komunikacji poprzez łącze nienazwane

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 6 Blokowanie odczytu i zapisu przy operowaniu na łączach nienazwanych Przy posługiwaniu się mechanizmem łącz pojawiają się wątpliwości. 1. Jak zachowa się funkcja read gdy odczytywane łącze jest puste? 2. Jak zachowa się funkcja write gdy zapisywane łącze jest pełne? O zachowaniu się procesów flaga O_NONBLOCK związana z plikami specjalnymi tworzonymi przez funkcję pipe. Pliki te domyślnie mają wyzerowaną flagę O_NONBLOCK. Flagę tę można kontrolować przy pomocy funkcji fcntl. Wielkość bufora łącza można testować wykonując funkcję: fpathconf(fd,_pc_pipe_buf) Odczyt Zapis Flaga O_NONBLOCK wyzerowana Funkcja read blokuje proces bieżący gdy łącze puste Funkcja write blokuje proces bieżący gdy łącze pełne Flaga O_NONBLOCK ustawiona Funkcja read zwraca 1 gdy łącze puste Funkcja write zwraca 1 gdy łącze pełne Tab. 4-3 Wpływ flagi O_NONBLOCK na blokowanie się procesów Flagę O_NONBLOCK testuje się przy pomocy funkcji: fcntl(fd, F_GETFL, O_NONBLOCK) Ustawić ją można za pomocą funkcji: fcntl(fd, F_SETFL, fcntl(fd, F_GETFL,O_NONBLOCK) O_NONBLOCK) Zamykanie łącz Co stanie się gdy deskryptor reprezentujący łącze zostanie zamknięty? 1. Zamknięcie deskryptora pliku do zapisu. Gdy istnieją inne procesy które mają otwarte te łącze dla zapisu nie dzieje się nic. Gdy nie gdy nie w łączu danych procesy zablokowane na odczycie zwracają zero. 2. Zamknięcie deskryptora pliku do odczytu. Gdy istnieją inne procesy które mają otwarte te łącze dla odczytu nie dzieje się nic. Gdy nie do wszystkich procesów zablokowanych na zapisie wysłany zostanie sygnał SIGPIPE.

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 7 pipe(fd) fork() close(fd[0]) close(fd[1]) write(fildes[1],...) read(fildes[0],...) close(fd[1]) Zapis close(fd[0]) Odczyt Rys. 3 Wzorzec wykorzystania łącz nienazwanych do komunikacji pomiędzy procesami

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 8 4.3 Łącza nazwane pliki specjalne typu FIFO Łącza nazwane (ang. named pipes) nazywane też plikami FIFO są narzędziem służącym do komunikacji międzyprocesowej. Posiadają następujące własności: tworzone są w pamięci operacyjnej, widziane są w przestrzeni nazw plików posiadają zwykłe atrybuty pliku w tym prawa dostępu. Plik FIFO tworzy się przy pomocy funkcji: int mkfifo(char * path, mode_t mode) path Nazwa pliku FIFO (ze ścieżką) mode Prawa dostępu do pliku. Funkcja zwraca: 0 sukces, -1 błąd. Aby proces mógł użyć pliku FIFO należy: 1. Utworzyć plik FIFO za pomocą funkcji mkfifo o ile wcześniej nie został utworzony. 2. Otworzyć plik FIFO za pomocą funkcji open. 3. Pisać lub czytać do / z pliku używając funkcji read lub write. 4. Zamknąć plik przy pomocy funkcji close. Własności plików FIFO. 1. Pliki FIFO są plikami specjalnymi tworzonymi w pamięci operacyjnej ale widzianymi w systemie plików komputera. Stąd procesy mające dostęp do tego samego systemu plików mogą się komunikować przez pliki FIFO. 2. Operacje zapisu odczytu do / z pliku FIFO są operacjami atomowymi. 3. Bajty odczytane z pliku FIFO są stamtąd usuwane. 4. Zachowanie się procesu przy próbie odczytu z pustego pliku FIFO lub zapisu do pełnego zależą od flagi O_NONBLOCK. 5. Informacje w pliku FIFO są pozbawione struktury. 6. Plik FIFO i jego zawartość ginie przy wyłączeniu komputera.

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 9 Proces 1 Proces 2 mkfifo("myfifo",...) mkfifo("myfifo",...) fd = open("myfifo,...) Plik FIFO fd = open("myfifo,...) write(fd,buf,size) read(fd,buf,size) close(fd) Zapis close(fd) Odczyt Rys. 4 Wzorzec wykorzystania plików FIFO main() { int fdes,res; static char c; // Utworzenie pliku FIFO ---- mkfifo("mypip",s_irusr S_IWUSR); fdes = open("mypip",o_rdonly); if(fdes < 0) { printf("open error %d \n",errno); exit(1); do { res = read(fdes, &c, 1); // Odczyt z pliku FIFO printf("odczytano: %c \n", c); while(res > 0); close(fdes); Przykład 4-3 Przykład procesu odczytującego znaki z pliku FIFO.

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 10 4.4 Sprawdzanie gotowości deskryptorów funkcja select Programy często korzystają z deskryptorowych funkcji wejścia-wyjścia. Źródła dające się opisać jako deskryptory plików są nastepujące: 1. Łącza nienazwane (pipes) 2. Łącza nazwane (pliki FIFO) 3. Gniazdka (sockets) 4. Znakowe rządzenia we/wy - klawiatura, złącza transmisji szeregowej 5. Blokowe urządzenia we/wy pliki W sytuacji gdy: Proces otrzymuje dane z wielu źródeł Odczyt z tych źródeł jest blokujący Występują trudności z odbiorem danych. Gdy oczekujemy na wejście z jednego procesu (wywołanie blokujące) nie odbieramy tego co jest na innych wejściach i odwrotnie. Blokada read(fd1,...) Plik 1 - brak z gotowości read(fd2,...) Plik 2 - gotowość Rys. 5 Blokujący odczyt z jednego pliku (fd1) nie pozwala na odczyt danych z drugiego pliku (fd2). Rozwiązania problemu odczytu (zapisu) z wielu źródeł dostarcza funkcja select. Funkcja select Funkcja select powoduje zablokowanie procesu bieżącego do czasu wystąpienia gotowości lub błędu na którymś z deskryptorów. Zwraca wtedy numer tego deskryptora. Odblokowuje się również wtedy gdy upłynie zadany okres oczekiwania (ang. timeout). #include <sys/time.h>

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 11 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval * timeout) nfds Liczba deskryptorów plików (maksymalne FD_SETSIZE) readfds Maska deskryptorów plików do odczytu (gotowość odczytu) writefds Maska deskryptorów plików do zapisu (gotowość zapisu) errorfds Maska deskryptorów plików dotyczących błędów timeout Maksymalny okres zablokowania Po wykonaniu funkcja ponownie ustawia maski bitowe readfds, writefds, errorfds zgodnie z wynikiem operacji czyli jeden bit ustawia inne zeruje. Funkcja zwraca: > 0 numer deskryptora na którym wystapiła gotowość 0 gdy zakończenie na przeterminowaniu -1 gdy błąd Funkcje operujące na maskach bitowych fd_set - typ zdefiniowany w <sys/time.h>. Bit i ustawiony na 1 o obecności deskryptora i w zbiorze. Przykład Deskryptory o numerach 1,2,3 są w zbiorze 7 6 5 4 3 2 1 0 0 0 0 0 1 1 1 0 Zerowanie zbioru fdset void FD_ZERO( fd_set *fdset) Włączenie deskryptora fd do zbioru fdset void FD_SET( int fd, fd_set *fdset) Testowanie czy fd włączony do zbioru fdset int FD_ISSET( int fd, fd_set *fdset) Wyłączenie fd ze zbioru fdset void FD_CLR( int fd, fd_set *fdset)

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 12 int fd, fd1, fd2 fd_set we, we1; // Otwarcie portów ----------- fd1 = open( /dev/ser1,o_rdwr); fd2 = open( /dev/ser2,o_rdwr); // Ustawienie masek bitowych -- FD_ZERO(&we); FD_SET(fd1,&we); FD_SET(fd2,&we); do { we1 = we fd = select(5,&we1,null,null,null); if(fd_isset(fd1,&we1) { read(fd1,...); if(fd_isset(fd2,&we1) { read(fd2,...); while (1); Przykład 4-4 Odczyt znaków z dwóch portów szeregowych Specyfikacja czasu Do określenia czasu oczekiwania stosuje się zmienną typu timeval (struktura) zdefiniowaną w pliku <sys/time.h>. #include <sys/time.h> struct timeval { long tv_sec; // sekundy long tv_usec; // mikrosekundy struct timeval tim; tim.tv_sec = 10; tim.tv_usec = 0; Przykład 4-5 Ustawienie parametrów przeterminowania

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 13 Przykład Serwer odczytuje zlecenia od 2 procesów klientów przez łącza nienazwane. Nie wiadomo na którym z łącz pojawi się zlecenie. Macierzysty rura[1] rura[2] Potomny 1 Potomny 2 Rys. 6 Serwer otrzymuje komunikaty z dwóch łącz nienazwanych

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 14 #include <sys/select.h> #define SIZE 9 char msg[2][size] = {"Proces 1","Proces 2"; void main(void) { int rura[2][2]; int i,pid,numer,bajtow, j = 0;; fd_set set; char buf[size]; FD_ZERO(&set); printf("set: %x\n",set); for(i=0;i<2;i++) { pipe(rura[i]); FD_SET(rura[i][0],&set); for(i=0;i<2;i++) { // Uruchamianie procesów potomnych if((pid = fork(0)) == 0) { potom(i,rura[i]); exit(0); // Macierzysty ------------- do { numer = select(fd_setsize,&set,null,null,null); for(i=0;i<2;i++) { if(fd_isset(rura[i][0],&set)) { bajtow = read(rura[i][0],buf,size); printf("z: %d otrzymano: %s\n",i,buf); j++; while(j<5); int potom(int nr,int rura[2]) { int i; for(i=0;i<5;i++) { printf("potomny: %d pisze: %s do: %d\n",nr, msg[nr], rura[1]); write(rura[1],msg[nr],size); sleep(1); return(1);

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 15 4.5 Komunikacja przez wspólne pliki Współdzielone pliki mogą być wykorzystane do komunikacji międzyprocesowej. Należy zabezpieczyć się przed jednoczesnym dostępem do pliku przez kilka procesów. P1 Zapis Kowalski P2 Odczyt K o w a i n s k i Bieżąca zawartość Z i e l i n s k i Poprzednia zawartość Rys. 7 Współbieżny dostęp do dzielonego pliku powoduje błędny odczyt (zjawisko wyścigów) Do blokowania dostępu do pliku służy funkcja lockf: int lockf (int fd, int function, long size); Gdzie: fd function size deskryptor pliku, F_LOCK - zajmij obszar z blokowaniem, F_ULOCK - zwolnij obszar, F_TLOCK sprawdź i zajmij obszar gdy jest wolny, gdy zajęty funkcja zwróci błąd. F_TEST - sprawdź czy obszar jest zajęty. rozmiar obszaru do blokady, jeśli 0 to blokowany rekord będzie miał rozmiar od pozycji bieżącej do końca pliku Funkcja zwraca: 0 gdy zakończy się sukcesem, -1 gdy błąd. Proces próbuje zająć określony obszar pliku poczynając od pozycji bieżącej. Gdy plik jest już zajęty proces jest blokowany do jego uwolnienia.

Jędrzej Ułasiewicz Łącza nienazwane, nazwane, funkcja select 16 #include <fcntl.h> #include <unistd.h> int fd; int status,res;... fildes = open("/home/cnd/mod1", O_RDWR); status = lockf(fd, F_TLOCK,0); res = write(fd,buf,sizeof(buf)); status = lockf(fd, F_ULOCK,0);... Przykład 4-6 Blokowanie pliku Inne funkcje blokowania dostępu do pliku: flock działa na deskryptorach FILE * fcntl działa na uchwytach int fd Gdy operujemy na deskryptorach FILE * można przejść na uchwyty za pomocą funkcji: int fileno(file *file)