# Systemy operacyjne - lista 3
## Zadanie 1 

__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

__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

___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


___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

___[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

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

```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

```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

```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);
}
```