---
# System prepended metadata

title: SO Lista 4
tags: [SO]

---

---
title: SO Lista 4
tags: SO
author: Mateusz Reis
---

# SO LISTA 4

## Zadanie 1
 - Wywołania read i write nie działają na katalogach ponieważ format katalogu jest zaplanowany jako systemowe metadane i to system jest odpowiedzialny za zarządzanie nimi. Użytkownik może je tylko modyfikować. 
 - **Rekord katalogu** - wpis w strukturze katalogu o strukturze [filename,inode] - do ich wyświetlenia służy readdir()
 - zawartość katalogu nie jest posortowana
 - **metadane katalogu** - dane wykorzystywane przez system takie jak: uprawnienia dostępu, numer inode czy liczba dowiązań
 - liczba dowiązań do '/' jest zależna od liczby podkatalogów (każdy katalog ma link do swojego rodzica) ~ aby to sprawdzić ll | grep -c dr
 - dowiązanie jest to rekord katalogu ~ do katalogu podobno nie można utworzyć hard-linków(może to wytworzyć nieskończoną pętle https://askubuntu.com/questions/210741/why-are-hard-links-not-allowed-for-directories) 

## Zadanie 3

![](https://i.imgur.com/UKg933O.png)

1. (0)sh - tworzy lub otwiera plik (creat() lub open()) 
2. (0)sh - fork()
3. (0)sh - waitpid()
4. (1)sh - pipe() out dla ps oraz in dla grep 
5. (1)sh - fork()
8. (1)sh - pipe() - out dla grep in dla wc
9. (1)sh - fork()
10. (1)sh - zmiana in na out grepa 
11. (1)sh - dup2() - zmiana out na stworzony plik
12. (2)sh - dup2() - zamiania stdout na in dla grep
13. (2)sh - execve(ps -ef)
14. (3)sh - dup2() - zmiana in na out ps 
15. (3)sh - dup(2) - zmiana out na in dla wc 
16. (3)sh - execve(grep sh)
17. (1)sh - execve(wc -l)
18. (0)sh - close()


## Zadanie 5 
 - Wykonywanie instrukcji pomiędzy append() a open() może dać szansę na stworzenie oraz otworzenie pliku przez inny proces ponieważ open z O_CREAT nie sprawdza czy plik istnieje. Aby temu zapobiec powinniśmy użyć oprócz flag O_CREAT i O_WRONLY flagi O_EXCL, która zwraca błąd jeśli plik istnieje. W rezultacie nie zawiesimy się na próbie Unlink().

```c 
#include "csapp.h"

bool f_lock(char* path){ return Open(path,O_CREAT|O_EXCL|O_WRONLY, 700)>0;}

void f_unlock(char* path){Unlink(path);}
```

 - Zagrożenia wynikające z tego błędu to możliwość zawieszenia się programu oraz podatność na ataki(inny proces może podpiąć dowiązanie do pliku)

## Zadanie 6 
 - **Kursor** - aktualna pozycja w pliku ~ od niej zostanie wzowione wczytywanie/pisanie 
 - **dowiązanie symboliczne** - plik, który wskazuje na inny plik/katalog