Вы находитесь на странице: 1из 3

Wojskowa Akademia Techniczna

Janusz Paszyński 03.05.2008


I6Y1S1

Systemy Operacyjne
Sprawozdanie z ćwiczeń laboratoryjnych

Prowadzący: dr inż. Zbigniew Zieliński

Janusz Paszyński I6Y1S1


Wojskowa Akademia Techniczna

Zadanie
Napisać program, który wywołany dla dwóch argumentów zadziała jak wywołanie w terminalu:

w | more
Wywołanie programu:
./potok w more

Rozwiązanie Zadania
W programie na początek zostaje utworzone łącze nienazwane. zostaje to wykonane poprzez
funkcję pipe(). Następnym etapem jest powołanie nowego procesu dla pierwszego argumentu.

W pierwszym procesie potomnym zostaje podmieniony deskryptor standardowego wyjścia na


deskryptor wyjścia łącza nienazwanego. Następnie oba deskryptory łącza zostają zamknięte.
Polecenie powłoki zostaje wykonane poprzez funkcję execlp().

W następnym kroku w procesie głównym zostaje powołany drugi proces potomny. W drugim
procesie potomnym podmieniony zostaje deskryptor standardowego wejścia na deskryptor wejścia
łącza. Ponownie oba deskryptory zostają zamknięte i zostaje wywołana funkcja execlp() w celu
podmiany procesu na proces polecenia.

Proces macierzysty po powołaniu obu procesów wywołuje funkcję wait() w celu zakończenia
dopiero po obu procesach potomnych. Następnie kończy swoje działanie wywołując funkcję
exit(0).

Kod Programu
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

int main(int argc,char* argv[])


{
int lacz[2],in,out;
int pid;
if(pipe(lacz)==-1)
{
perror("Tworzenie lacza sie nie udalo");
exit(1);
}
pid=fork();
if(pid==-1)
{
perror("Tworzenie procesu sie nie udalo");
exit(1);
}
if(pid==0)
{
dup2(lacz[1],1);

Janusz Paszyński I6Y1S1


Wojskowa Akademia Techniczna

close(lacz[0]);
close(lacz[1]);
execlp(argv[1],argv[1],NULL);
}
if(pid)
{
int pid2=fork();
if(pid2==-1)
{
perror("tworzenie procesu 2 nieudane");
exit(1);
}
if(!pid2)
{
dup2(lacz[0],0);
close(lacz[0]);
close(lacz[1]);
execlp(argv[2],argv[2],0);
}
close(lacz[0]);
close(lacz[1]);
wait(NULL);
wait(NULL);
exit(0);
}
}

Przykład Wywołania
Program powyższy obsługuje jedynie proste polecenia bez argumentów. Dla wielu poleceń wynik
jest dokładnie taki sam jak wynik wywołania polecenia pierwszego. Różnica jest widoczna przy
wywołaniu jako drugiego polecenia wc.
Wywołanie programu:

eloar@k1~>./potok ls wc
27 27 377
eloar@k1~>

Wnioski
Łącza nienazwane są przydatne niestety tylko w zakresie procesów jednej aplikacji. Mogą jednak
służyć do szybkiego łączenia wejść i wyjść procesów. Przy ich pomocy można szybko i w łatwy
sposób pobrać do programu wynik wywołania jakiegoś polecenia systemowego.
Niektóre polecenia wymagają jawnego zamknięcia łącza przez proces macierzysty. Na przykład
polecenie more, albo polecenie less. Te dwa polecenia czekają tak długo, aż nie zakończy się ich
standardowe wejście. W przypadku tego programu niezamknięcie tych deskryptorów zakończyłoby
się zakleszczeniem aplikacji. Jeśli jednak usunąć wywołanie funkcji wait() z aplikacji,
zakończyłaby się ona, jednak polecenie oczekujące na koniec swojego wejścia nie mogłoby
poprawnie się zakończyć, a raczej dać poprawnego wyniku. Testy takiego rozwiązania dały wynik
w postaci nie wyświetlania wpisywanych znaków na konsoli po wywołaniu aplikacji, oraz nie
wyświetlanie znaku końca linii. Wszystkie polecenia były jednak poprawnie przyjmowane.

Janusz Paszyński I6Y1S1

Вам также может понравиться

  • Gramatyka Jezyka Angielskiego
    Gramatyka Jezyka Angielskiego
    Документ164 страницы
    Gramatyka Jezyka Angielskiego
    api-26356906
    100% (1)
  • Paszynski I6B2S1 ORR Babelkowe
    Paszynski I6B2S1 ORR Babelkowe
    Документ23 страницы
    Paszynski I6B2S1 ORR Babelkowe
    api-26356906
    100% (1)
  • Obsługa VTC
    Obsługa VTC
    Документ64 страницы
    Obsługa VTC
    Michal Kamienowski
    0% (1)
  • Zadanie Laboratoryjne
    Zadanie Laboratoryjne
    Документ1 страница
    Zadanie Laboratoryjne
    api-26356906
    Оценок пока нет
  • Plan Implementacji
    Plan Implementacji
    Документ2 страницы
    Plan Implementacji
    api-26356906
    Оценок пока нет
  • Or Wyklad 5
    Or Wyklad 5
    Документ9 страниц
    Or Wyklad 5
    api-26356906
    Оценок пока нет
  • cw5 Paszynski
    cw5 Paszynski
    Документ5 страниц
    cw5 Paszynski
    api-26356906
    Оценок пока нет
  • Or Wyklad 4b
    Or Wyklad 4b
    Документ19 страниц
    Or Wyklad 4b
    api-26356906
    Оценок пока нет
  • Or Wyklad 4a
    Or Wyklad 4a
    Документ18 страниц
    Or Wyklad 4a
    api-26356906
    Оценок пока нет
  • cw5 Paszynski
    cw5 Paszynski
    Документ5 страниц
    cw5 Paszynski
    api-26356906
    Оценок пока нет
  • Przykładowe Pytania Testowe
    Przykładowe Pytania Testowe
    Документ1 страница
    Przykładowe Pytania Testowe
    api-26356906
    Оценок пока нет
  • Prezentacja 1
    Prezentacja 1
    Документ18 страниц
    Prezentacja 1
    api-26356906
    Оценок пока нет
  • Zadanie Lab Oblicz Rownolegle
    Zadanie Lab Oblicz Rownolegle
    Документ1 страница
    Zadanie Lab Oblicz Rownolegle
    api-26356906
    Оценок пока нет
  • cw4 Przechwytywanie
    cw4 Przechwytywanie
    Документ3 страницы
    cw4 Przechwytywanie
    api-26356906
    Оценок пока нет
  • Zadanie Lab-Sieci Kolejkowe
    Zadanie Lab-Sieci Kolejkowe
    Документ3 страницы
    Zadanie Lab-Sieci Kolejkowe
    api-26356906
    Оценок пока нет
  • cw4 Paszzynski
    cw4 Paszzynski
    Документ4 страницы
    cw4 Paszzynski
    api-26356906
    Оценок пока нет
  • Bazy2008B Material
    Bazy2008B Material
    Документ3 страницы
    Bazy2008B Material
    api-26356906
    Оценок пока нет
  • Zaj Lab 8
    Zaj Lab 8
    Документ1 страница
    Zaj Lab 8
    api-26356906
    Оценок пока нет
  • cw4 Paszzynski
    cw4 Paszzynski
    Документ4 страницы
    cw4 Paszzynski
    api-26356906
    Оценок пока нет
  • AiSD W08
    AiSD W08
    Документ40 страниц
    AiSD W08
    api-26356906
    100% (1)
  • Aisd w9
    Aisd w9
    Документ75 страниц
    Aisd w9
    api-26356906
    100% (1)
  • 13 Wyzwalacze
    13 Wyzwalacze
    Документ4 страницы
    13 Wyzwalacze
    api-26356906
    100% (1)
  • Zaj Lab 9
    Zaj Lab 9
    Документ1 страница
    Zaj Lab 9
    api-26356906
    Оценок пока нет
  • Linux Semafory Opis
    Linux Semafory Opis
    Документ3 страницы
    Linux Semafory Opis
    api-26356906
    Оценок пока нет
  • AiSD W08
    AiSD W08
    Документ40 страниц
    AiSD W08
    api-26356906
    100% (1)
  • AiSD W7
    AiSD W7
    Документ29 страниц
    AiSD W7
    api-26356906
    Оценок пока нет
  • AiSD W02
    AiSD W02
    Документ56 страниц
    AiSD W02
    api-26356906
    Оценок пока нет
  • AiSD W06
    AiSD W06
    Документ28 страниц
    AiSD W06
    api-26356906
    Оценок пока нет
  • Sop 09 Lab
    Sop 09 Lab
    Документ7 страниц
    Sop 09 Lab
    api-26356906
    Оценок пока нет
  • Sop 07 Lab
    Sop 07 Lab
    Документ10 страниц
    Sop 07 Lab
    api-26356906
    Оценок пока нет
  • MathCAD - Tutorial - PL PDF
    MathCAD - Tutorial - PL PDF
    Документ9 страниц
    MathCAD - Tutorial - PL PDF
    Mirosław Szczepaniec
    Оценок пока нет
  • Egzamin Maturalny Z Informatyki 2003
    Egzamin Maturalny Z Informatyki 2003
    Документ7 страниц
    Egzamin Maturalny Z Informatyki 2003
    Cody222
    Оценок пока нет
  • Bpmn2 0 Poster PL
    Bpmn2 0 Poster PL
    Документ1 страница
    Bpmn2 0 Poster PL
    doooku11
    Оценок пока нет