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



Podobne dokumenty
Łącza nienazwane(potoki)

Kolejki FIFO (łącza nazwane)

4.2 Sposób korzystania z l acza

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h >

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

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

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

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

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

Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)

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

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

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

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

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

SYSTEMY OPERACYJNE I laboratorium 3 (Informatyka stacjonarne 2 rok, semestr zimowy)

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

Obsługa plików Procesy

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

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

Biblioteka standardowa - operacje wejścia/wyjścia

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

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

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

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

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

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

Podstawy programowania w języku C++

Temat zajęć: Obsługa procesów w systemie.

Programowanie w językach wysokiego poziomu

Programowanie Procedurale. Pliki w języku C++

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

Strumienie i pliki. Programowanie Proceduralne 1

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

Podstawy programowania w języku C++

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

MATERIAŁY POMOCNICZE PODSTAWY PROGRAMOWANIA Na podstawie: Programowanie w C - Stworzone na Wikibooks, bibliotece wolny podręczników

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

Programowanie w językach

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Sygnały. 7. Sygnały (2005/2006)

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

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Pobieranie argumentów wiersza polecenia

Procesy i potoki. S. Samolej: Procesy

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

Podstawy programowania w języku C++

W języku C każdy plik fizyczny jest ciągiem bajtów, z których każdy może być niezależnie odczytany. Borland 01234

Argumenty wywołania programu, operacje na plikach

Program wykonujący operację na plikach powinien zachować schemat działania zapewniający poprawną pracę:

wer. 7 z drobnymi modyfikacjami Wojciech Myszka :48:

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

Programowanie Proceduralne

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

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

Programowanie Proceduralne

Operacje na plikach (niskiego poziomu) < IO.H >

Ghost in the machine

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

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

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

7 Przygotował: mgr inż. Maciej Lasota

Podstawy programowania w języku C++

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

Języki programowania. Tablice struktur, pliki struktur. Część ósma. Autorzy Tomasz Xięski Roman Simiński

Operacje wejścia/wyjścia odsłona pierwsza

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Klasa iostream... 1 Klasy ofstream, ifstream Struktura FILE... 8

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

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

Procesy w systemach UNIX i Linux

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

Formatowane (tekstowe) wejście/wyjście. Binarne wejście/wyjście.

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

PRZYKŁADY OPERACJI PLIKOWYCH z wykorzystaniem biblioteki <stdio.h>

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

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

Temat zajęć: Tworzenie i obsługa wątków.

Narzędzia informatyczne w językoznawstwie

Podstawy programowania 1

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Operacje powiązane z systemem:

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19

Procesy. S. Samolej: Procesy

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

UŻYCIE I ZARZĄDZANIE WĄTKAMI

Pliki, potoki, sygnały

argumenty wiersza poleceń: getopt

UŻYCIE I ZARZĄDZANIE WĄTKAMI

Wstęp. #define include include include include include include

3 Przygotował: mgr inż. Maciej Lasota

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

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

Struktury czyli rekordy w C/C++

Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła

Procesy, pliki, potoki, sygnały - uzupełnienie

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Transkrypt:

Przykład: $ ls more Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi. Tworzenie łącza #include <unistd.h> int pipe(int filedes[2]); Przykład: int fd[2]; int r_fd; int w_fd; char buf[512]; proces użytkownika read() write() pipe_fds[0] pipe_fds[1] if (pipe(fd)!=0 ) { perror("pipe()");... r_fd=fd[0]; w_fd=fd[1];... read(r_fd,buf,sizeof(buf)); jądro systemu łącze przepływ danych Stała PIPE_BUF Sygnał SIGPIPE Błąd EPIPE 1

Wykorzystanie łącza do komunikacji między procesem macierzystym i potomnym proces macierzysty: tworzy łącze proces potomny: ma kopię read() pipe_fds[0] write() pipe_fds[1] read() pipe_fds[0] write() pipe_fds[1] łącze jądro systemu Przykład: Przesyłanie komunikatów od procesu macierzystego do procesu potomnego. proces macierzysty proces potomny read() pipe_fds[0] write() pipe_fds[1] read() pipe_fds[0] write() pipe_fds[1] łącze jądro systemu 2

Przykład: Proces macierzysty pisze do potoku, proces potomny czyta i wyświetla na ekranie. Obydwa procesy korzystają ze strumieni we-wy. #include <stdlib.h> #include <unistd.h> 7. Potoki void zapisywanie(const char* komunikat, int licznik, FILE* strumien){ for (; licznik > 0; --licznik) { fprintf (strumien, "%s\n", komunikat); fflush (strumien); sleep (1); void odczytywanie (FILE* strumien) { char bufor[1024]; while (!feof (strumien) &&!ferror (strumien) && fgets (bufor, sizeof (bufor), strumien)!= NULL) fputs (bufor, stdout); 3

int main () { int fd[2]; pid_t pid; pipe(fd); pid = fork (); /* proces potomny */ if (pid == (pid_t) 0) { FILE* strumien; close (fd[1]); strumien = fdopen(fd[0], "r"); odczytywanie(strumien); close(fd[0]); / * proces macierzysty */ else { FILE* strumien; close(fd[0]); strumien = fdopen(fd[1], "w"); zapisywanie("witam!", 5, strumien); close(fd[1]); return 0; 4

Przykład: Program generuje napisy. Chcemy je wyświetlić w kolejności alfabetycznej. Możemy to zrealizować przekazując wyjście standardowe programu na wejście polecenia systemowego sort. #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main () { int fd[2]; pid_t pid; pipe(fd); pid = fork (); if (pid == (pid_t) 0) { close(fd[1]); dup2(fd[0], STDIN_FILENO); close(fd[0]); execlp("sort", "sort", 0); else { FILE* strumien; close (fd[0]); strumien = fdopen(fd[1], "w"); fprintf(strumien, "Witam.\n"); fprintf(strumien, "Welcome.\n"); fprintf(strumien, "Bienvenue.\n"); fprintf(strumien, "Willkommen.\n"); fflush(strumien); close(fd[1]); waitpid(pid, NULL, 0); return 0; 5

Funkcje popen i pclose biblioteka standardowa we-wy FILE *popen(const char *cmdstring, const char *type); int pclose(file *fp); Przykład: fp=popen("sort","w"); proces macierzysty proces potomny ("sort") fp łącze kierunek przepływu danych stdin #include <unistd.h> int main () { FILE* strumien = popen("sort","w"); fprintf (strumien, "Witam.\n"); fprintf (strumien, "Welcome.\n"); fprintf (strumien, "Bienvenue.\n"); fprintf (strumien, "Willkommen.\n"); fflush (strumien); return pclose(strumien); 6

Przykład: fp=popen("who sort","r"); proces macierzysty proces potomny ("who sort") fp łącze kierunek przepływu danych stdout #include <stdlib.h> int main() { FILE *fp; char buf[100]; int i = 0; fp = popen( "who sort", "r" ); while ( fgets( buf, 100, fp )!= NULL ) printf("%3d %s", i++, buf ); pclose( fp ); return 0; Wady: mała efektywność - utworzenie procesu potomnego to za każdym razem uruchomienie shella i zastąpienie go właściwym poleceniem 7

Przykład: Dane przetwarzane przez główną aplikację są wstępnie przetwarzane przez program pomocniczy. (Stevens, Programowanie w środowisku Unix, str. 518) 7. Potoki proces macierzysty - główna aplikacja proces potomny - filtr popen stdout stdout stdin prompt użytkownik przy terminalu dane wprowadzanie przez użytkownika /* program pomocniczy - filtr */ #include <ctype.h> int main(void){ int c; while ( (c = getchar())!= EOF) { if (isupper(c)) c = tolower(c); if (putchar(c) == EOF) { fprintf(stderr,"%s\n","blad wyjscia"); exit(1); if (c == '\n') fflush(stdout); exit(0); 8

/* główna aplikacja */ #include <sys/wait.h> #define MAXW 80 int main(){ char wiersz[maxw]; FILE *we; if ( (we = popen("./filtr", "r")) == NULL) { perror("popen: blad"); exit(1); for ( ; ; ) { fputs("prompt> ", stdout); fflush(stdout); if (fgets(wiersz, MAXW, we) == NULL) break; if (fputs(wiersz, stdout) == EOF){ fprintf(stderr,"%d\n","blad przesłania do potoku"); exit(1); if (pclose(we) == -1) { perror("pclose"); exit(1); putchar('\n'); exit(0); 9

Łącza nazwane (kolejki FIFO) Łącze nazwane jest to plik specjalny, który zachowuje się tak jak potok. Dane są buforowane przez jądro, nie są przechowywane na dysku! Łącze nazwane ma nazwę, zatem może być otwarte i dostępne dla dowolnego procesu, który zna nazwę łącza i ma odpowiednie prawa dostępu do łącza. Łącze istnieje aż do jawnego usunięcia. Tworzenie łącza Łącze nazwane może być utworzone na dwa sposoby: za pomocą funkcji systemowej #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); Funkcja mkfifo tworzy łącze nazwane (kolejkę FIFO, ang. named pipe) o nazwie pathname, które ma prawa dostępu określone w argumencie mode. Jeśli łącze zostanie utworzone zwracane jest 0, w przeciwnym wypadku -1 i ustawiana zmienna errno. za pomocą polecenia: $ mkfifo /tmp/fifo $ ll /tmp/fifo prw-rw-rw- 1 user1 users 0 Nov 19 15:01 /tmp/fifo 10

Dostęp do plików FIFO Dostęp do plików FIFO jest realizowany tak, jak do zwykłego pliku. Aby można było przesyłać dane za pomocą pliku FIFO, jeden program musi otworzyć go do czytania, zaś drugi do pisania. Można używać funkcje poziomu niższego (open, write,close, itd.) funkcje biblioteczne we-wy języka C (fopen, fprintf, fscanf, fclose, itd.) int fd = open(nazwa_fifo,o_wronly); write(fd, bufor, ile); close (fd); FILE* fifo=fopen(nazwa_fifo,"r"); fscanf(fifo,"%s",bufor); fclose(fifo); Wywołanie read() dla łącza FIFO, które nie jest już otwarte do zapisu, zwraca koniec pliku (wartość 0). Wywołanie read() dla łącza FIFO, które jest otwarte do zapisu i puste: blokujące czeka na nadejście danych nieblokujące zwraca -1 i errno przyjmuje wartość EAGAIN Wywołanie write() dołącza dane na koniec łącza. 11