Strona 1 z 1

komunikacja międzyprocesowa, potoki

: 18 paź 2009, 20:18
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.

Odp: komunikacja międzyprocesowa, potoki

: 18 paź 2009, 21:31
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

Odp: komunikacja międzyprocesowa, potoki

: 18 paź 2009, 21:45
autor: Szczech
Coś mi się wydaje, że jednak ma to być potok nienazwany, bo polecenie z użyciem potoków FIFO pojawiają się dalej..

Odp: komunikacja międzyprocesowa, potoki

: 18 paź 2009, 22:31
autor: leon1313
[do usunięcia]

Odp: komunikacja międzyprocesowa, potoki

: 18 paź 2009, 22:43
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.

Odp: komunikacja międzyprocesowa, potoki

: 18 paź 2009, 23:53
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: