# Lista 4 ###### tags: `SO` ## Zadanie 1 ## Zadanie 2 **Działanie programu `scipt`** `script` zapisuje cały input i output sesji terminala. Robi to ustawiając się między terminalem a nowym wywołaniem powłoki. Nie zostaną zapisane hasła, ponieważ nie są one `echo`-wane. **ICRNL** tłumaczy powrót karetki na znak nowej linii (CR -> NL) **ONLCR** tłumaczy znak nowej linii na znak powrotu karetki i nowej linii (NL -> CRNL) ## Zadanie 3 ## Zadanie 4 ## Zadanie 5 **Czemu nie można czytać i modyfikować katalogów przy pomocy wywołań read(2) i write(2)?** Katalog jest jedynym typem pliku, który zawiera listę rekordów. W związku z tym odyczy i zapisy na nim w postaci bajtów mogą nie być do końca dobrym pomysłem. **Jakim wywołaniem systemowym można wczytać rekord katalogu (ang. directory entry )?** `readdir(directory)` **Dlaczego zawartość katalogu nie jest posortowana?** System plików porządkuje zawartość tak, jak mu wygodnie. ![](https://i.imgur.com/Y2gNMQ6.png) ![](https://i.imgur.com/TTWc4Z4.png) **Wyświetl metadane katalogu głównego «/» przy pomocy polecenia «stat», a następnie wyjaśnij z czego wynika podana liczba dowiązań (ang. hard link)?** Istnieje jedno dowiązanie na samego siebie i po jednym dowiązaniu dla każdego z podkatalogów. ![](https://i.imgur.com/QK9qlTu.png) ## Zadanie 6 ```c= #include "csapp.h" bool f_lock(const char *path) { return (void)Open(path, O_CREAT|O_WRONLY|O_EXLOCK, 0700) >= 0); } void f_unlock(const char *path) { Unlink(path); } ``` ## Zadanie 7 ```c= for (int i = max_fd; i > 2; i--){ char buf[250]; char filePath[PATH_MAX]; if(fcntl(i, F_GETPATH, filePath) != -1 && i != out) { printf("FD: %d %s\n", i, filePath); off_t t = lseek(i, 0, SEEK_SET); read(i,&buf,255); printf("Test: %s\n", buf); } } ``` ![](https://i.imgur.com/aMjWLV9.png) ## Zadanie 8 ```c= #include "csapp.h" int main() { struct stat *buf = malloc(sizeof(struct stat)); stat("./holes.bin", buf); printf("st_blksize: %d\n", buf->st_blksize); /* Block size for filesystem I/O */ printf("st_stblocks: %d\n", buf->st_blocks); /* Number of 512B blocks allocated */ printf("st_size: %d\n", buf->st_size); /* Total size, in bytes */ printf("cl_size: %d\n", buf->st_blksize * buf->st_blocks); } ``` Dzięki dziurom.