Bardziej zaawansowane ssh

W laboratorium komputerowym na naszym wydziale znajduje się serwer students, do którego jest możliwy dostęp z sieci publicznej. Na tym serwerze każdy student i pracownik naukowy wydziału MIM ma swoje konto. Na swoje konto można się zalogować poleceniem ssh abXXXXXX@students.mimuw.edu.pl. Komputery w laboratorium, nazywane czasami końcówkami, znajdują się w jednej sieci lokalnej wraz z serwerem students. Gdy jesteśmy już połączeni z serwerem, to możemy połączyć się przez ssh z konkretnym urządzeniem (a właściwie zalogować się na swoje konto na konkretnym komputerze). Na przykład, aby zalogować się na komputer o nazwie red01 można użyć polecenia ssh red01 (nasza nazwa użytkownika abXXXXXX jest dodawana automatycznie, równoważnie można użyć polecenia ssh abXXXXXX@red01). Listę wszystkich komputerów w sieci można znaleźć poleceniem ruptime, a listę wszystkich włączonych na przykład poleceniem ruptime | grep up (chociaż aktualnie, prawdopodobnie ze względu na migrację serwerów wydziałowych z PLD na Debiana). Alternatywnie, listę uruchomionych komputerów można znaleźć na tej stronie (zrobionej przez jednego ze studentów).

markdown:

Do dokumentowania projektów informatycznych często używa się języka markdown (rozszerzenie .md). Wsparcie dla poprawnego wyświetlania tego typu plików ma chociażby serwis GitHub (Przykład użycia). Całkiem dobra ściąga znajduje się tutaj.

Cała moja strona domowa jest napisana w tym języku. Kod pliku lab03.md wklejam tutaj:

### Segmenty pamięci programu

Pamięć działającego programu podzielona jest na segmenty. Podział na segmenty jest dobrze zobrazowany przez rysunek z [wikipedii](https://en.wikipedia.org/wiki/Data_segment).

![](https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Program_memory_layout.pdf/page1-234px-Program_memory_layout.pdf.jpg "From wikipedia by Dougct")

Po kompilacji programu ustalana jest zawartość segmentów `text`, `data` oraz `bss`.
- `text` - kod źródłowy programu, zwykle jest to obszar tylko do odczytu,

- `data` - zainicjalizowane zmienne globalne,

- `bss` - niezainicjalizowane zmienne globalne.

Podczas działania program korzysta z dwóch dodatkowych segmentów `stack` oraz `heap`.

- `stack` - stos wywołań funkcji programu. Jeśli wywołamy w naszym programie jakąś funkcję, to tutaj będą dodane argumenty dla tej funkcji oraz jej zmienne lokalne. Po zakończeniu wywołania funkcji te zmienne znikają z pamięci, dlatego próba zwrócenia z funkcji wskaźnika na zmienną lokalną zakończy się niepowodzeniem.

- `heap` - sterta zawiera wszystkie zmienne, na które pamięć została dynamicznie zaalokowana. Jej zawartość nie jest zwalniana w momencie zdejmowania wywołania funkcji ze stosu.

### `static` oraz `extern`
Słowo kluczowe `static` może budzić wątpliwości - po co w ogóle go używać, skoro nie umieszczamy danej zmiennej/funkcji w pliku nagłówkowym?
Odpowiedź jest prosta - możemy użyć funkcji/zmiennej z jednego modułu w drugim module bez załączania pliku nagłówkowego - wystarczy zadeklarować istnienie zmiennej/funkcji o danej nazwie, a linker połączy tą deklarację z implementacją za nas.
Tutaj znajduje się dokładniejsze, bardzo sensowne wyjaśnienie tego zjawiska - [link](https://stackoverflow.com/a/2841771).

### make:
Przy pisaniu plików `makefile` warto pamiętać, że aby dowiedzieć się, czy należy przebudować dany moduł, program `make` sprawdza datę edycji jedynie plików wpisanych jako zależności.
Tzn jeśli do pliku źródłowego dodamy nową zależność `#include "something.h"`, to załączany moduł należy dodać do zależności w `makefile`.