# SO Lista 4
## Zadanie 1

### Pojęcia
Kod sterujacy CPR zwraca aktualna pozycje kursora.
### Zadania
Kod ```tty_curpos```
```c=
void tty_curpos(int fd, int *x, int *y) {
struct termios ts, ots;
tcgetattr(fd, &ts); //Retrieve the attributes of terminal
memcpy(&ots, &ts, sizeof(struct termios));
ts.c_lflag &= ~(ECHO | ICANON);
ts.c_cflag &= ~CREAD;
tcsetattr(fd, TCSADRAIN, &ts);
/* How many characters in the input queue. */
int m = 0;
/* TODO: Need to figure out some other way to do it on MacOS / FreeBSD. */
#ifdef LINUX
ioctl(fd, TIOCINQ, &m);
#endif
/* Read them all. */
char discarded[m];
m = Read(fd, discarded, m);
Write(fd, CPR(), sizeof(CPR()));
char buf[20];
int n = Read(fd, buf, 19);
buf[n] = '\0';
ts.c_lflag |= ICANON;
tcsetattr(fd, TCSADRAIN, &ts);
for (int i = 0; i < m; i++)
ioctl(fd, TIOCSTI, discarded + i);
tcsetattr(fd, TCSADRAIN, &ots);
sscanf(buf, "\033[%d;%dR", x, y);
}
```
SADRAIN - Ustawienia, po wczytaniu bufora
Flaga ECHO przełącza wypisywanie inputu w terminalu.
Flaga
## Zadanie 2

### Pojęcia
### Zadania
#### Komendy
```shell=
script -T timing -c dash
exit 42
scriptreplay -t timing
strace -f -e read,write -o script.log
```

## Zadanie 3

### Pojęcia
### Zadania
```ps -ef | grep sh | wc -l > cnt```
Kolejność:
```
1 : execve("/usr/bin/dash", ["dash"], 0x7fff9104e658 /* 46 vars */) = 0
64 : 27363 pipe([3, 4]) = 0
65 : 27363 clone(child_stack=NULL,
flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,
child_tidptr=0x7f273bc5a850) = 27370
70 : 27363 close(4 <unfinished ...>
72 : 27363 <... close resumed>) = 0
94 : 27363 pipe( <unfinished ...>
96 : 27363 <... pipe resumed>[4, 5]) = 0
98 : 27363 clone(child_stack=NULL,
flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|
SIGCHLD <unfinished ...>
100 : 27370 dup2(4, 1) = 1
101 : 27363 <... clone resumed>, child_tidptr=0x7f273bc5a850) = 27371
102 : 27370 close(4 <unfinished ...>
108 : 27363 close(3 <unfinished ...>
111 : 27370 execve("/usr/bin/ps", ["ps", "-ef"],
0x555f2f693cb0 /* 46 vars */ <unfinished ...>
126 : 27370 <... execve resumed>) = 0
139 : 27363 clone(child_stack=NULL,
flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID
|SIGCHLD <unfinished ...>
144 : 27371 dup2(3, 0 <unfinished ...>
146 : 27371 <... dup2 resumed>) = 0
147 : 27363 <... clone resumed>, child_tidptr=0x7f273bc5a850) = 27372
148 : 27371 close(3 <unfinished ...>
155 : 27371 dup2(5, 1 <unfinished ...>
159 : 27371 <... dup2 resumed>) = 1
173 : 27371 execve("/usr/bin/grep", ["grep", "sh"], 0x555f2f693cb0
/* 46 vars */ <unfinished ...>
186 : 27371 <... execve resumed>) = 0
193 : 27372 dup2(4, 0 <unfinished ...>
196 : 27372 <... dup2 resumed>) = 0
203 : 27372 openat(AT_FDCWD, "cnt", O_WRONLY|O_CREAT|O_TRUNC, 0666 <unfinished>
207 : 27372 <... openat resumed>) = 3
224 : 27372 dup2(3, 1 <unfinished ...>
227 : 27372 <... dup2 resumed>) = 1
233 : 27372 execve("/usr/bin/wc", ["wc", "-l"], 0x555f2f693cc8
/* 46 vars */ <unfinished ...>
241 : 27372 <... execve resumed>) = 0
```
## Zadanie 4

### Pojęcia
### Zadania
```
65 : 27363 clone(child_stack=NULL,
flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,
child_tidptr=0x7f273bc5a850) = 27370
66 : 27363 setpgid(27370, 27370 <unfinished ...>
67 : 27370 getpid( <unfinished ...>
68 : 27363 <... setpgid resumed>) = 0
69 : 27370 <... getpid resumed>) = 27370
71 : 27370 setpgid(0, 27370 <unfinished ...>
75 : 27370 ioctl(10, TIOCSPGRP, [27370] <unfinished ...>
```

Zwracanym kodem zakończenia potoku jest kod zakończenia ostatniego polecenia, chyba że włączono opcję pipefail.
## Zadanie 5

### Pojęcia
### Zadania
Read oraz write działają na poziomie bajtów. Katalogi są zorganizowane w listę rekordów. Dopuszczenie czytania/pisania katalogów przy użyciu read/write zignorowałoby granicę miedzy rekordami, co pozwoliłoby na bardzo proste uszkodzenie katalogów(w przypadku write).
Rekord katalogu można wyświetlić przy pomocy **getdirentries** na linuxie. Nie jest to polecenie usystematyzowane, dlatego zaleca się stosowanie **readdir** z biblioteki standardowej.
Dlaczego zawartosc katalogu jest nie posortowana??
Po wyświeteleniu metadanych pojawia się liczba twardych dowiązań. Są to katalogi które wskazują na katalog "/", poprzez odwołanie się do rodzica, czyli ". ." W katalogu znajdują się też miekkie dowiązania(soft link), które odnoszą się do dalszych dzieci "/". Nie są to dowiązania twarde, funkcjonują bardziej jako skrót.
## Zadanie 6

### Pojęcia
### Zadania
## Zadanie 7

### Pojęcia
### Zadania
## Zadanie 8

### Pojęcia
### Zadania
Pole st_size struktury stat zwraca rozmiar pliku. Dla pliku holes.bin wynosi ona 33550336. Jednak po policzeniu miejsca zajmowanego przez bloki pamięci okazuje się że faktyczna objętość pliku jest dużo mniejsza (1112 * 512 = 569344). Wynika to z występowania dziur w pliku, uzyskanych dzięki zapisywaniu danych poza granicami pliku. Pole st_size zwraca rozmiar wliczając w to dziury. Dlatego wartość ta jest większa od rozmiaru bloków zawierających dane(bez dziur).