LABORATORIUM 3


WEJŚCIE I WYJŚCIE STANDARDOWE PROCESU. PRZEKIEROWANIA, FILTRY I POTOKI

WEJŚCIE I WYJŚCIE STANDARDOWE PROCESU

Przez domniemanie wejście standardowe skojarzone jest z klawiaturą terminala, zaś wyjście standardowe i standardowe wyjście błędów - z oknem tekstowym terminala (dlatego też pojawiają się w nim zarówno użyteczne wyniki działania programów, jak i komunikaty o błędach). Procesy (uruchomione programy) w trybie tekstowym mają od początku działania przyporządkowane trzy otwarte deskryptory:
PPRZEKIEROWANIA

Domniemane przyporządkowanie deskryptorów można zmienić (na przykład chcąc wprowadzić z pliku dużą ilość danych lub zapisać w pliku dużą ilość wyników) przy użyciu operatorów przekierowania: Powyższe operatory przekierowań (i także potoku) mogą być wykorzystywane jednocześnie w linii poleceń, służąc do konstruowania poleceń złożonych.

ZADANIA

Zad. 1
Przy użyciu polecenia ls -l > plik zapisać w pliku zawartość bieżącego katalogu. Wyświetlić (cat plik), sprawdzić.
Zad. 2
Użyć polecenia cat > plik do bezpośredniego zapisu tekstu (kilka linijek) do pliku (ctrl-d kończy działanie polecenia). Sprawdzić (cat plik). Sprawdzić, że ponowne polecenie cat > plik nadpisuje poprzednią zawartość pliku, a polecenie cat >> plik - dopisuje nowy tekst do poprzedniej zawartości. Wypróbować działanie samego polecenia cat.
UWAGA: w systemach uniksowych znak ASCII pełniący rolę standardowego znacznika końca strumienia tekstowego (EOT - End Of Transmission) jest skojarzony z kombinacją kluczy ctrl-d . W systemach Windows analogiczną rolę pełni ctrl-z .

Zad. 3
Zapoznać się z możliwością używania przez proces interpretera poleceń deskryptorów plików większych, niż 2:
  1. echo -n abcdefghijklmn > nazwa_pliku # zapis ciągu znaków do pliku o podanej nazwie
    cat nazwa_pliku # sprawdzenie, że plik zawiera to, co wpisaliśmy
  2. exec 3<> nazwa_pliku # otwarcie pliku do zapisu i odczytu przy użyciu deskryptora 3
  3. read -n 5 <&3 # przesunięcie miejsca bieżącego dostępu do zawartości otwartego pliku o 5 pozycji do przodu
  4. echo -n ABC >&3 # nadpisanie trzech kolejnych znaków w pliku innymi znakami
  5. exec 3>&- # zamknięcie deskryptora 3
    cat nazwa_pliku # wyświetlenie aktualnej zawartości pliku
POTOKI


Potok (pipe) łączy stdout jednego procesu z stdin drugiego procesu. Przykład:

program1 | program2 # obydwa procesy zostaną uruchomione współbieżnie, standardowe wyjście pierwszego procesu zostanie połączone bezpośrednio ze standardowym wejściem drugiego procesu

ZADANIA CD.

Zad. 4
Utworzyć program w języku C:
#include <stdio.h>

main() {
	unsigned n;
	scanf("%d",&n);
	printf("%d",2*n);
	return 0;
}
kopiując najpierw powyższą zawartość do pliku i zapisując go jako program.c
Następnie skompilować go przy użyciu polecenia: gcc program.c -o program
Wypróbować działanie poleceń:
a) ./program
b) ./program | ./program
c) ./program | ./program | ./program
Zad. 5
Napisać nieduży program w języku C zawierający kilka błędów składniowych, skompilować go przy użyciu polecenia gcc program.c i obejrzeć wyświetlony wykaz błędów. Użyć przekierowania standardowego wyjścia błędów:
gcc program.c 2> plik
Obejrzeć zawartość utworzonego pliku.
FILTRY


ZADANIA CD.

Zad. 6
Wyświetlić zawartość dużego katalogu korzystając z polecenia ls -l katalog | more (klucze aktywne - i spacja). Wyświetlić zawartość dużego pliku tekstowego korzystając z polecenia cat plik | more , porównać jego działanie z działaniem polecenia more < plik oraz polecenia more plik. Przeczytać opis i wypróbować działanie polecenia less.
Zad. 7
Zapisać w pliku (przy użyciu dowolnego edytora tekstowego) ciąg kilkunastu wyrazów - po jednym w jednej linii (nie używać polskich znaków). Wyświetlić posortowaną listę wyrazów korzystając z polecenia cat plik | sort , porównać jego działanie z działaniem polecenia sort < plik oraz polecenia sort plik . Zapisać wynik sortowania w drugim pliku: sort < plik > plik1 , sprawdzić (cat plik1). Użyć polecenia sort > plik do posortowania ciągu wyrazów wprowadzonego z klawiatury (ctrl-d kończy wpisywanie).
Zad. 8
Przeczytać opisy poleceń head oraz tail. Utworzyć polecenie złożone (potok poleceń), które pobierze od użytkownika listę nazwisk wprowadzonych z klawiatury (po jednym w jednej linii, bez polskich znaków), posortuje ją alfabetycznie i wyświetli:
a) 5 pierwszych pozycji
b) 3 ostatnie pozycje
w posortowanym ciągu nazwisk.
Zad. 9
Przeczytać opis polecenia tee. Wykorzystać polecenie tee plik > plik1 do zapisu tekstu wprowadzonego z klawiatury do dwóch plików jednocześnie. Porównać zawartości obu plików.

Zad. 10
Przeczytać opisy poleceń zewnętrznych ln oraz stat. Utworzyć w bieżącym katalogu plik tekstowy o nazwie aaa.txt zawierający dowolny tekst. Przy użyciu polecenia
stat aaa.txt
sprawdzić, że liczba dowiązań do tego pliku wynosi 1. Przy użyciu polecenia
ln aaa.txt bbb.txt
utworzyć dodatkowe dowiązanie do pliku aaa.txt.
Sprawdzić (ls), że oba dowiązania są widoczne w bieżącym katalogu. Przy użyciu polecenia stat (z którymkolwiek z argumentów) sprawdzić, że liczba dowiązań wynosi obecnie 2. Sprawdzić, że jakakolwiek zmiana: a) zawartości pliku; b) praw dostępu do pliku dla jednego z dowiązań jest natychmiast widoczna również dla drugiego z nich. Sprawdzić, że usunięcie (rm) jednego z dowiązań nie niszczy drugiego z nich, a jedynie zmniejsza licznik dowiązań o 1.
Zad. 11
W zespołach 2- lub 3-osobowych wypróbować możliwość tworzenia dowiązań do cudzych plików. Jakie są minimalne prawa dostępu: a) do katalogu, w którym znajduje się dany plik; b) do samego pliku, aby inni członkowie zespołu mogli utworzyć do niego dowiązanie ? Czy późniejsze ograniczenie tych praw wpływa na możliwość dalszego korzystania z utworzonego dowiązania (czyli dostępu do zawartości pliku) ?