# SO Lista 4 ## Zadanie 1 ![](https://i.imgur.com/MLtyHu4.png) ### 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 ![](https://i.imgur.com/XknZ1Un.png) ### Pojęcia ### Zadania #### Komendy ```shell= script -T timing -c dash exit 42 scriptreplay -t timing strace -f -e read,write -o script.log ``` ![](https://i.imgur.com/3Is208E.png) ## Zadanie 3 ![](https://i.imgur.com/15XZCBG.png) ### 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 ![](https://i.imgur.com/Siqbky8.png) ### 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 ...> ``` ![](https://i.imgur.com/bWn7VX7.png) Zwracanym kodem zakończenia potoku jest kod zakończenia ostatniego polecenia, chyba że włączono opcję pipefail. ## Zadanie 5 ![](https://i.imgur.com/cRcfRu8.png) ### 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 ![](https://i.imgur.com/UVFw4s5.png) ### Pojęcia ### Zadania ## Zadanie 7 ![](https://i.imgur.com/xMFwNYs.png) ### Pojęcia ### Zadania ## Zadanie 8 ![](https://i.imgur.com/pQHGOXU.png) ### 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).