---
# System prepended metadata

title: SO Lista 4

---

# 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).