[trtkal@localhost iosys]$ hostname
localhost
[trtkal@localhost iosys]$ hostname --h
Použití:
    hostname [-v] {jméno|-F soubor}       nastaví jméno počítače (ze souboru)
    domainname [-v] {jméno|-F soubor}     nastaví jméno NIS domény (ze
                                          souboru)
       hostname [-v] [-d|-f|-s|-a|-i|-y]  display formatted name
    hostname [-v]                         vypíše jméno počítače

    hostname -V|--version|-h|--help       vypíše informace a skončí

    dnsdomainname=hostname -d, {yp,nis,}domainname=hostname -y

    -s, --short           krátké jméno počítače
    -a, --alias           přezdívky
    -i, --ip-address      adresy odpovídající jménu počítače
    -f, --fqdn, --long    dlouhé jméno počítače (kanonické)
    -d, --domain          jméno DNS domény
    -y, --yp, --nis       jméno NIS/YP domény
    -F, --file            čte jméno počítače či nis domény ze souboru

   This command can read or set the hostname or the NIS domainname. You can
   also read the DNS domain or the FQDN (fully qualified domain name).
   Unless you are using bind or NIS for host lookups you can change the
   FQDN (Fully Qualified Domain Name) and the DNS domain name (which is
   part of the FQDN) in the /etc/hosts file.
[trtkal@localhost iosys]$ touch cviceni02.txt
[trtkal@localhost iosys]$ ll
celkem 4
-rw-r--r-- 1 trtkal trtkal 0 2009-10-12 13:19 cviceni02.txt
[trtkal@localhost iosys]$ mkdir cviceni02
[trtkal@localhost iosys]$ ll
celkem 8
drwxr-xr-x 2 trtkal trtkal 4096 2009-10-12 13:19 cviceni02/
-rw-r--r-- 1 trtkal trtkal    0 2009-10-12 13:19 cviceni02.txt
[trtkal@localhost iosys]$ ll -a
celkem 16
drwxr-xr-x  3 trtkal trtkal 4096 2009-10-12 13:19 ./
drwxr-xr-x 29 trtkal trtkal 4096 2009-10-12 13:17 ../
drwxr-xr-x  2 trtkal trtkal 4096 2009-10-12 13:19 cviceni02/
-rw-r--r--  1 trtkal trtkal    0 2009-10-12 13:19 cviceni02.txt
[trtkal@localhost iosys]$ ln cvi
cviceni02/     cviceni02.txt  
[trtkal@localhost iosys]$ ln cviceni02.txt odkaz_cviceni02
[trtkal@localhost iosys]$ ll -a
celkem 20
drwxr-xr-x  3 trtkal trtkal 4096 2009-10-12 13:21 ./
drwxr-xr-x 29 trtkal trtkal 4096 2009-10-12 13:17 ../
drwxr-xr-x  2 trtkal trtkal 4096 2009-10-12 13:19 cviceni02/
-rw-r--r--  2 trtkal trtkal    0 2009-10-12 13:19 cviceni02.txt
-rw-r--r--  2 trtkal trtkal    0 2009-10-12 13:19 odkaz_cviceni02
[trtkal@localhost iosys]$ vim cvi
cviceni02/     cviceni02.txt  
[trtkal@localhost iosys]$ vim odkaz_cviceni02
[trtkal@localhost iosys]$ ll -a
celkem 28
drwxr-xr-x  3 trtkal trtkal 4096 2009-10-12 13:21 ./
drwxr-xr-x 29 trtkal trtkal 4096 2009-10-12 13:21 ../
drwxr-xr-x  2 trtkal trtkal 4096 2009-10-12 13:19 cviceni02/
-rw-r--r--  2 trtkal trtkal   15 2009-10-12 13:21 cviceni02.txt
-rw-r--r--  2 trtkal trtkal   15 2009-10-12 13:21 odkaz_cviceni02
-rw-r--r--  1 trtkal trtkal    0 2009-10-12 13:19 odkaz_cviceni02~
[trtkal@localhost iosys]$ rm od
odkaz_cviceni02   odkaz_cviceni02~  
[trtkal@localhost iosys]$ rm odkaz_cviceni02~
rm: smazat běžný prázdný soubor „odkaz_cviceni02~“?
[trtkal@localhost iosys]$ ll -a
celkem 28
drwxr-xr-x  3 trtkal trtkal 4096 2009-10-12 13:21 ./
drwxr-xr-x 29 trtkal trtkal 4096 2009-10-12 13:21 ../
drwxr-xr-x  2 trtkal trtkal 4096 2009-10-12 13:19 cviceni02/
-rw-r--r--  2 trtkal trtkal   15 2009-10-12 13:21 cviceni02.txt
-rw-r--r--  2 trtkal trtkal   15 2009-10-12 13:21 odkaz_cviceni02
-rw-r--r--  1 trtkal trtkal    0 2009-10-12 13:19 odkaz_cviceni02~
[trtkal@localhost iosys]$ ln -s cvi
cviceni02/     cviceni02.txt  
[trtkal@localhost iosys]$ ln -s cviceni02 odkaz_cviceni02
ln: vytvářím symbolický odkaz „odkaz_cviceni02“: Soubor již existuje
[trtkal@localhost iosys]$ ln -s cviceni02 odkaz_adresar_cviceni02
[trtkal@localhost iosys]$ ll -a
celkem 28
drwxr-xr-x  3 trtkal trtkal 4096 2009-10-12 13:22 ./
drwxr-xr-x 29 trtkal trtkal 4096 2009-10-12 13:21 ../
drwxr-xr-x  2 trtkal trtkal 4096 2009-10-12 13:19 cviceni02/
-rw-r--r--  2 trtkal trtkal   15 2009-10-12 13:21 cviceni02.txt
lrwxrwxrwx  1 trtkal trtkal    9 2009-10-12 13:22 odkaz_adresar_cviceni02 -> cviceni02/
-rw-r--r--  2 trtkal trtkal   15 2009-10-12 13:21 odkaz_cviceni02
-rw-r--r--  1 trtkal trtkal    0 2009-10-12 13:19 odkaz_cviceni02~


type soubor - zobrazí alias souboru (ll)
ln -s    adresář    odkaz - odkaz na adresář
ln    soubor    odkaz - odkaz na soubor
cat - výpis souboru
more - výpis soubor
pwd - aktuální adresář
rm
rmdir
mk
mkdir


ps -ef-el -e    procesy
top    - vypisuje běžící procesy, dobu běhu...
    ?    - nápověda
    k    - zabití procesu 15 . normálně, 9 násilně
pidof(0)
pgrep(0)
kill(1)
killall(1)
pkill(1)
nice    - ohleduplní na ostatní uživatelé :D, nižší priorita

pstree    - stromová struktura
echo $$    - vypíše ID shellu

fg, bg, wait, sleep    - popředí, pozadí, čeká na dokončení úlohy, zapauzování procesu

ATD - opakované spouštění aplikací (obdoba cron)
    at čas [HH:mm nebo HH:MM YYYY-MM-DD]
    at > příkazy
    ^D ukončení vstupu
$echo 'příkaz' | at čas
    předdefinované příkazy pro čas:
        now - aktuální čas
            today
            tomorrow
        noon
        midnight
        teatime (4pm = 16:00)
    čas může být i jako interval:
        now + interval (min, hour, day, week)
atq - zobrazí seznam zadaných příkazů (at queue - fronta)
atrm č.úlohy - zrušení
at -c č.úlohy - vypsání obsahu úlohy


#at 10:55
#at>echo date
#at>^D
#atd

#echo 'date' | at now + 3 min
echo Dnes je `date +%A` - vypíše Dnes je Pondělí
echo "Dnes je `date +%A\ %H`" - vypíše Dnes je Pondělí HODINA
echo 'Dnes je `date +%A\ %T`' | at date + 3min

vypsání v půlce minuty:
    #at 11:15
    at>sleep 30
    at>date
    at>^D

CRON
    crontab
                            field          allowed values
              -----          --------------
              minute         0-59
              hour           0-23
              day of month   1-31
              month          1-12 (or names, see below)
              day of week    0-7 (0 or 7 is Sun, or use names)

#crontab 0,5,10 7 * * 1-5 echo Vstavej! - pošle ráno 3× od pondělí do pátku vstávej na email

    */5 - každou pátou hodnotu
    */2 - každou sudou hodinu
    1-23/2 - každou lichou hodinu
    % se bere jako vstup příkazu
    %% enter enter

crontab -l - výpis
crontab -r - smazání crontabu

crontab -e
    # 0 14 * * 5 echo je patek, jdi domu | mail -s upozorneni email@domena.tld

cron - pokud PC neběží v danou dobu, cron se neprovádí
anacron - na desktopu - po zapnutí se crony provedou v jinou dobu (nejdéle nejspíš po dobu jednoho týdne)

Kompilace souborů
#cc source.c - vytvoří se soubor a.out (unixy přecházejí i s linuxem na elf)
#cc source.c -o source (výsledný soubor se bude jmenovat source)

#gcc source.c -o source (kompilátor od GNU)

po zkompilování nelze program stále spustit, jelikož není v PATH adresářích! - bezpečnsotí rizika (např. ls binárka v aktuálním adresáři)

#PATH = $PAHT:nová_cesta
spuštění příkazu z aktuálního adresáře: ./source

Makefile:
    source: source.c
    gcc ...
    urychluje kompilaci, provádí kompilaci jen potřebných souborů

1. stažení:
wget URI - stáhne soubor z webu
wget -r URI - mirror, vytvoří obraz FTPčka :)

2. rozbalování:
    tar zxf archiv.tar.gz
    tar jxf archiv.tar.bz2

    x - extract
    v - view - zobrazení co se rozbaluje
    f - file (nechceme rozbalovat z pásky)
    starší varianta:
        gunzip < a.tar.gz | tar xf -
        bunzip < a.tar.bz2 | tar xf -
3. konfigurace
    ./configure --prefix=$HOME/local
4. kompilace
    make
5. instalace
    make install

Rekompilace
    make clean (nutný pro rekompilaci)

stow - vytváření adresářové struktury pro vytvořené binárky
~/local/stow#stow wget-1.12 - vytvoří odkazy
~/local/stow#stow -D wget-1.12 - dmazání WGETů

příkaz stow vytváří adresářovou strukturu...
    stow -d pro "odinstalaci"

CV 7
wget soubor
cat single_main.c
gcc single_main.c -o single_main
./single_main

gcc -Wal -g single_main.c -o single_main

strip singel_main - zmenšuje velikost, odstraňuje nějaký symboly ze spustitelnýho kódu...

gcc -c jen kompiluje zdroják, neznaží se sestavit funkční chybu (nenalezený další soubory - např. funkcí)

gcc -Wall -c main.c
gcc -Wall -c a.c
gcc -Wall -c b.c
vytvoří 3 soubory X.o - pak se musí nalinkovat!
gcc main.o a.o b.o -o hello_world
linker teď umí sestavit funkční kód, tak ho vytvoří a pojmenuje hello_world
.\hello_world

je to zdlouhavý a tak si vytvoříme makefile :)

vim Makefile
obsah:
all: single_main

single_main: single_main.c
    gcc -Wall single_main.c -o single_main


Pro druhý projekt složitější Makefile:
CC = gcc
CFLAGS = -Wall

LD = gcc
LDFLAGS =

RM = /bin/rm -f
OBJEKTY = main.o a.o b.o

PROGRAMY = single_main hello_world

all: $(PROGRAMY)

single_main: single_main.c
        gcc -Wall single_main.c -o single_main

hello_world: $(OBJEKTY)
        $(LD) $(LDFLAGS) $(OBJEKTY) -o hello_world

main.o: main.c
        $(CC) $(CFLAGS) -c main.c

a.o: a.c
        $(CC) $(CFLAGS) -c a.c

b.o: b.c
        $(CC) $(CFLAGS) -c b.c

clean:
        $(RM) $(OBJEKTY) $(PROGRAMY)

Roura:
http://asuei01.upceucebny.cz/usr/hudec/vyuka/sos/foxconn/obecne/brandejs/20150.html

Pojmenovaná roura:
funguje jako fifo fronta v souboru, první co se zapíše se také čte. po přečtení se opět maže

Grafický editor:
gedit

Makefile roura.c
CC = gcc
CFLAGS = -Wall

all: roura

clean:
    rm -f roura


Makra v roura.c
ukončení procesu: WIFEXITED returned true
status: WEXITSTATUS(status) - funguje jen když WIFEXIT vrátí true

Signály:

http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/progr/tutorials/signals/
HW přerušení - předává OS nebo lze vyvolat systémovým voláním Kill
Systém začne provádět obslužnou fci, ...

kill -l
- seznam signálů
19    - sigstop nelze zachytit
9    - sigkill též nelze zachytit
15    - sigterm - zachytitelný, lze např. uložit data
2    - sigint - při např. zmáčknutí ctrl+c
1 - sighup - odhlášení uživatele - uložení rozpracované práce
sigusr - může si naprogramovat sám uživatel
sigchild - v případě, že potomek byl ukončen. volá se wait, jinak zůstává z procesu zombie proces
sigstp - ukončovací zachytitelný
sigttou - pro výpis na stdout
sigalrm - po určité době zapne "alarm"
sigwinch - změna velikost okna např. midnight commander
sigrtmax -1 až -14

ctrl+c - sigint
ctrl+\- sigabrt

z konzole: kill -INT cislo_ID
    sleep 120
    ctrl+z pozastaví aplikaci
    bg - pošle aplikaci na pozadí

    sleep 60 & - spustí aplikaci přímo na pozadí
    jobs - výpis aplikací
    kill -INT PID_procesu
ps - vypisuje process id

kill -9 PID_procesu (pošle signál 9 kill)

Příkaz pro C:
#include <signal.h>
kill(my_pid, SIGSTOP);

man 7 signal

#include <signal.h> /* signal name macros, and the signal() prototype */

/* first, here is the signal handler */
void catch_int(int sig_num)
{
/* re-set the signal handler again to catch_int, for next time */
signal(SIGINT, catch_int);
/* and print the message */
printf("Don't do that");
fflush(stdout);
}

Obsluha signálů - tabulka s adresama na funkce
číslo    handler        původní
2        catch_int
         SIG_IGN                        ignorován
         SIG_DFL                     nastaví defaultní hodnotu

7.12.2009

Opakování signal, pak alarmy...
http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/OS1/02-signaly/alarm_INT.c

Vlákna

http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/progr/tutorials/multi-thread/multi-thread.html

http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/OS1/03-vlakna/Makefile
http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/OS1/03-vlakna/pthread_create.c
make clean
make pthread_create


Mutexy
http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/progr/tutorials/multi-thread/multi-thread.html
Atomicita
Singularita - zamyká mutex, pak mění, poté opět odemkne mutex - musíme zajistit exklusivní přístup nebo co...
http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/progr/tutorials/multi-thread/employee-without-mutex.c

gcc -Wall -lpthread employee-without-mutex.c -o employee-without-mutex
gcc -Wall -lpthread employee-with-mutex.c -o employee-with-mutex


Podmínkové proměnné

čekání na událost.
http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/progr/tutorials/multi-thread/multi-thread.html

Creating And Initializing A Condition Variable

Příklad line count
http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/progr/tutorials/multi-thread/line-count.c
http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/materialy/progr/tutorials/multi-thread/very_large_data_file.Z
uncompress very_large_data_file.Z

Semestrálka
http://asuei01.upceucebny.cz/usr/hudec/vyuka/os/#ulohy

uname -a

makefily,

info-st22312.txt
    cat /proc/meminfo
    cat /proc/procinfo

Neodevzdávat žádné soubory navíc!!!
make clean
zabalit do tar.gz podadresáře Prijmnei-Jmeni-netID

rozbalení: tar sxf ... zbytek shodný

Poslední hodina

převod virtuální na fyzickou adresu:

0x00008C2E
4 KiB = 4096 B = 2^12 = 16^3 (2^4 = 16 | 4×3 = 12) - číslo vyjádříme v 12 cifrách
kolik je offset a kolik zbývá na
4 cifry tvoří offset...
8 je index do stránkové tabulky... čísluje se od nuly, hledáme 9 položku
C2E
V stránkové tabulce si přečteme číslo rámce, to vezmeme: 0x4F8E3 - určuje počáteční fyzickou adresu, připočítáme 3 nuly - první adresa v rámci 0x4F8E3000
následující rámec má 0x4F8E4000
výsledek: 0x4F8E3C2E
64KiB = 65535 = 2^16 = 16^4
adresa rozdělena: 0x0|8 C2E
256B = 2^8 = 16^2
0x0|8C|2E
Segmentace
 v segmentu je počáteční adresa celá!, délka segmentu
 
 ofset 16b - najdeme adresu, nikoli číslo
 musíme vzít i délku.. porovnat s ofsetem, pokud bude délka větší - jedná se o neplatný odkaz
 délka segmentu > ofset - platný odkaz
 
 k adrese přičteme délku ofsetu
 
0x0|8C|23
 | segment   | limit/velikost segmentu
0 | 0x01350210 | 0x9000
porovnat 9000 s 8C2E - platná adresa
0x01350210
+  0x08C23
----------
0x1358E3E - fyzická adresa
------------------------------------------------------------------------------------------------------------------
12|34h
   | LE | BE
100h | 34 | 12
101h | 12 | 34
network by order
 nezajímá nás, jaký ve skutečnosti je...
 převádíme z LE a BE do NBO
host by order
 převádí z network by order zpět do BE nebo LE
Převod portu (pozná si architekturu - přenositelný prpogram):
 htons(); - shortint (host to net)
 ntohs(); - shorint (net to host)
 htonl(); - long
 ntohl(); - long
Sockety:
 sockaddr_in {
  short int sin_family; // rodina adres - IPv4
  unsigned short sin_port; //port
  struct sockaddr_in sa; //struktura adresy
 }