# Systemy operacyjne - lista 3 ## Zadanie 1 ![](https://i.imgur.com/E7fhohn.png) ![](https://i.imgur.com/bKjShWj.png) __KTO JEST JEGO STARYM RODZICEM__ - bash -i __KTO JEST JEGO NOWYM RODZICEM__ - /usr/lib/systemd/systemd --user > ps -ef -o pid,sid -> sprawdza __Co się dzieje z sesją która utraci terminal sterujący__ - Wszyscy członkowie sesji dostają __SIGHUP__ (defaultowa akcja - TERMINATE ;c ) __Co się dzieje z sesją która shella__ - reparenting > https://www.gnu.org/software/libc/manual/html_node/Local-Modes.html ## Zadanie 2 https://man.netbsd.org/termios.4 ![](https://i.imgur.com/Y3vhJlo.png) __Jak zachowuje się sterownik terminala działającego w trybie kanonicznym?__ Input jest przetrwarzany wiersz po wierszu dopóki nie dostanie EOF Interpretacja znaków specjalnych Wypisywanie znaków wprowadzonych przez użytkownika na ekran ___{MAX_CANON}, {MAX_INPUT}___ - Max wielkosc w B wiersza/inputu W trybie kanonicznym mamy do dyspozycji rzeczy typu ___ERASE___ - usuwa ostatni wyraz, ___KILL___ - usuwa caly wiersz ![](https://i.imgur.com/ksRWOMH.png) ___Jaką konfigurację terminala powinien zmienić program na czas wpisywania hasła przez użytkownika?___ - Powinien wyłączyć echo - ___[stty -echo]___ ___Czemu edytory takie jak vi konfigurują sterownik terminala do pracy w trybie niekanonicznym?___ - W trybie niekanonicznym dostajemy input znak po znaku poza tym wyłączamy rzeczy typu ^W itd. ## Zadanie 3 ![](https://i.imgur.com/gMJISK3.png) ![](https://i.imgur.com/5FPuHpQ.png) ___Program może zostać poinformowany o zmianie rozmiaru okna terminala. W tym celu musi zainstalować procedurę obsługi sygnału - którego?___ - SIGWINCH ___Jaką procedurą można wczytać nowy rozmiar okna?___ - Procedura to ___[stty cols 80 rows 50]___ ## Zadanie 4 https://en.wikipedia.org/wiki/ANSI_escape_code ![](https://i.imgur.com/SUYEZdY.png) ___[echo -e]___ - nie musimy wciskac np ^G - mozemy wpisac \007 -> interpretuje input jako caly bajt echo -e '\007' == ^G -> Bell itd echo -e '\012 == \0x0a' -> nowa linia echo -e '\033[94;5m moja mama' echo -e '\033[94;5m '; read ## Zadanie 5 ![](https://i.imgur.com/cqlY7Zg.png) 1) ^Z -> SIGSTOP 2) ^S -> STOP, ^Q -> START (stty -a) - Ponieważ zatrzymane jest wyjście 3) Zadanie zostało od razu wstrzymane ponieważ oczekuje wejścia a jest w bg. Flaga odpowiadająca to SIGTTIN 4) TOSTOP - Wysyła SIGTTOU do grupy procesów które działają w tle jeżeli proces chce pisać na wyjście terminala 5) Zmienia wyświetlanie znaków sterujących Jeżeli flaga echoctl jest włączona to wyświetla znaki kontrolne w notacji z daszkiem np. ^c ## Zadanie 6 ![](https://i.imgur.com/7oYAait.png) ```armasm= typedef struct { long rbx; long rbp; long r12; long r13; long r14; long r15; void *rsp; void *rip; } Jmpbuf[1]; ``` ```armasm= Setjmp: movq (%rsp),%r11 movq %rbx,(_JB_RBX * 8)(%rdi) movq %rbp,(_JB_RBP * 8)(%rdi) movq %r12,(_JB_R12 * 8)(%rdi) movq %r13,(_JB_R13 * 8)(%rdi) movq %r14,(_JB_R14 * 8)(%rdi) movq %r15,(_JB_R15 * 8)(%rdi) movq %rsp,(_JB_RSP * 8)(%rdi) movq %r11,(_JB_RIP * 8)(%rdi) xorl %eax,%eax ret Longjmp: movq (_JB_RBX * 8)(%rdi),%rbx movq (_JB_RBP * 8)(%rdi),%rbp movq (_JB_R12 * 8)(%rdi),%r12 movq (_JB_R13 * 8)(%rdi),%r13 movq (_JB_R14 * 8)(%rdi),%r14 movq (_JB_R15 * 8)(%rdi),%r15 movq (_JB_RSP * 8)(%rdi),%rsp movq (_JB_RIP * 8)(%rdi),%r11 movl %esi,%eax testl %eax,%eax jnz 1f incl %eax 1: movq %r11,(%rsp) ret ``` ___Dlaczego [Jmpbuf] nie przechowuje wszystkich rejestrów procesora?___ - Ponieważ procedury Setjmp oraz Longjmp zapisują/przywracają tylko rejestry callee saved, caller saved nie ___Czemu [Longjmp] zapisuje na stos wartość przed wykonaniem instrukcji ret?___ - Ponieważ ustawiamy adres powrotu który zapisaliśmy wcześniej w ___[Setjmp]___ ## Zadanie 7 ![](https://i.imgur.com/HvNJI8x.png) ```cpp= static void signal_handler(int signo) { /* TODO: Something is missing here! */ // wracamy i przywracamy do env i zwracamy numer sygnalu siglongjmp(env, signo); } /* If interrupted by signal, returns signal number. Otherwise converts user * provided string to number and saves it under num_p and returns zero. */ static int readnum(int *num_p) { char line[MAXLINE]; int n; /* TODO: Something is missing here! Use Read() to get line from user. */ // Ustawiamy alarm co sekunde ;d alarm(1); // zapisujemy aktualny stan z sygnalami ;d n = sigsetjmp(env, 1); // zwracamy numer sygnalu jak tutaj wrocimy inaczej omijamy if(n) return n; // Wczytujemy od uzytkownika dane n = Read(1, &line, MAXLINE); // wstawiamy na koniec \0 line[n] = '\0'; // wyłączamy czasomierz :D alarm(0); *num_p = atoi(line); return 0; } ``` ## Zadanie 8 ![](https://i.imgur.com/WQLeQfN.png) ```cpp= static noreturn void coro_switch(int v) { coro_t *curr = running; /* TODO: Use description above to implement the body. */ // Jeżeli dostaliśmy EOF if(v == EOF) { // Usuwamy program z kolejki TAILQ_REMOVE(&runqueue, curr, co_link); // Jeżeli kolejka jest pusta -> wracamy do dispatchera if(TAILQ_EMPTY(&runqueue)){ Longjmp(dispatcher, NOTHING); } } //Jeżeli jesteśmy na końcu kolejki if(TAILQ_NEXT(curr, co_link) == NULL){ // robimy ją od nowa - zaczynamy od początku running = TAILQ_FIRST(&runqueue); Longjmp(running->co_ctx, v); } // w przeciwnym wypadku po prostu lecimy do kolejnego:D running = TAILQ_NEXT(curr, co_link); Longjmp(running->co_ctx, v); } ```