komunikacja międzyprocesowa, potoki

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Szczech
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 03 lis 2007, 11:53
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

komunikacja międzyprocesowa, potoki

Post autor: Szczech »

Witam,

mam następujące zadanie do zrobienia:
Uruchom potok co najmniej trzech poleceń działających przez jakiś zauważalny czas. Mogą to być odpowiednio dobrane polecenia systemowe, lub samodzielnie napisane skrypty. Sprawdź poleceniem ps jakie zachodzi pokrewieństwo między tymi procesami (jeśli w ogóle zachodzi).

Wskazówka: ponieważ potok służy do przesyłania danych od procesu do procesu, i synchronizuje pracę wszystkich procesów odpowiednio do pojawiających się danych, dobrą metodą generowania demonstracyjnego potoku jest umieszczenie na jego początku procesu, wysyłającego na swoje wyjście stały strumień danych, np. piszącego w pętli co sekundę jakiś krótki komunikat.
Nie do końca wiem jak się za to zabrać...

Moja interpretacja jest następująca: należy wydać jakieś polecenia (procesy), które bedą komunikować się ze sobą. Np. Proces1 wypisze jakieś dane na swoje wyjście następnie Proces2 te dane odczyta i ewentualnie przetworzy no i Proces3 przeczyta wyjście z Procesu2 i coś wydrukuje na swoje wyjście. Napisałem taki skrypt:

Kod: Zaznacz cały

#!/bin/bash
while...#nieskonczona petla
do
  ps -a| wyswietlenie procesow
  grep pts/6| filtrowanie procesow terminala nr 6
  wc -l| przeliczenia procesow
  sleep 1
done
Ta pętla nieskończona jest w sumie chyba niepotrzebna. Obawiam się jednak, ze nie o to chodziło w poleceniu. Niby są te polecenia połączone w potok gdzie wyjście jednego potoku jest wejściem kolejnego, ale czy to ma sens?

Z góry dzięki za odpowiedź

PS. Jak znacie jakieś fajne linki do nauki zarządzania procesami, potokami i sygnałami to wstawcie.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: komunikacja międzyprocesowa, potoki

Post autor: beluosus »

Też nie bardzo rozumiem polecenie... ja to bym zrobił tak: tworzymy potok ("mkfifo test"), uruchamiamy dwa terminale, na jednym uruchamiamy ten skrypt niżej ("./skrypt.sh"), na drugim robimy "cat test" i obserwujemy jak te 3 pętle wysyłają tekst do potoku. W czasie wykonywania skryptu patrzymy na "ps -ely". Wszystkie 3 będą miały PPID=0, ponieważ są uruchomione w tle (&). Ale czy o to chodzi to nie wiem... :D

Kod: Zaznacz cały

#!/bin/bash

for ((i = 0; i < 10; i++)); do echo -e "Skrypt PIERWSZY:\t$i"; sleep 1; done  > test && echo "Koniec działania PIERWSZEGO skryptu." > test &
for ((i = 0; i < 10; i++)); do echo -e "Skrypt DRUGI   :\t\t$i"; sleep 1.2; done  > test && echo "Koniec działania DRUGIEGO skryptu." > test &
for ((i = 0; i < 10; i++)); do echo -e "Skrypt TRZECI  :\t\t\t$i"; sleep 1.4; done  > test && echo "Koniec działania TRZECIEGO skryptu." > test &
PS Te polecenia zawsze są niezrozumiałe dla mnie, a rozwiązanie jest takie proste. :P
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Szczech
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 03 lis 2007, 11:53
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: komunikacja międzyprocesowa, potoki

Post autor: Szczech »

Coś mi się wydaje, że jednak ma to być potok nienazwany, bo polecenie z użyciem potoków FIFO pojawiają się dalej..
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: komunikacja międzyprocesowa, potoki

Post autor: leon1313 »

[do usunięcia]
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: komunikacja międzyprocesowa, potoki

Post autor: beluosus »

Ach... fakt, jakoś nie przyszło mi do głowy, że może chodzić o potok nienazwany. Jakoś na fifo zawsze mówię potok, a na | mówię 'pajp'. ;) W takim razie wystarczy jakieś czasochłonne operacje wykonać, np:

Kod: Zaznacz cały

dd if=/dev/urandom count=10000 | tr -d "\n" | sha512sum
Niestety drugi akapit nie bardzo do mnie dociera. ;) Powodzenia.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Szczech
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 03 lis 2007, 11:53
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: komunikacja międzyprocesowa, potoki

Post autor: Szczech »

Nie jestem pewien, ale w tej wskazówce chodzi chyba o to, żeby pokazać, że jeden potok czeka na drugi tzn. powiedzmy, że program wypisuje co sekundę jakieś zdanie i np. programem 'sed' wyszukujemy jakieś słowo i zamieniamy je na inne.
Mniej więcej tak to zrobiłem:

Kod: Zaznacz cały

#!/bin/bash
while [ 1 = 1 ]
do
  echo "Ale fajny ciekawy tekst"
  sleep 1
done
I teraz w konsoli:

Kod: Zaznacz cały

 ./skrypt | sed -e 's/fajny/glupi/' | sed -e 's/ciekawy/nudny/'
i można śledzić teraz PID i PPID

@beluosus: co prawda nie wiem co robi Twoje polecenie, ale też jest dobre pod warunkiem, że jest się szybkim w przełączaniu terminali:grin:
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 16 gości