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