V této kapitole si něco povíme o tom, jak jsou některé věci pro programátora zjednodušeny tzv. unifikací, jaké jsou problémy pro programátory se standardizací a dále si vyložíme některé základní pojmy z oblasti systému souborů, na které navážeme v další kapitole.
Základem jednotného prostředí systému unix je myšlenka existence jednotného základního programovacího jazyka, kterým je jazyk C. Programy tedy tvoříme v jazyku C, přičemž využíváme služeb jádra systému unix. Na tomto základě dosáhneme snadné přenosnosti programů (na úrovni zdrojových textů), neodstraníme tím však závislost programu na používaných výstupních zařízeních. Odstínění této závislosti lze však provést tak, že použijeme tzv. unifikované služby pro výstup. A až při spuštění programu stanovíme konkrétní výstupní zařízení.
V systému unix jde unifikace ještě dále -- jádro skrývá rozdíl mezi používáním souborů a vnějších zařízení. Prostředí programu v rámci systému unix tvoří proto výhradně soubory. Některé soubory lze pouze číst (z vstupních zařízení např. klávesnice), do některých lze pouze zapisovat (z výstupních zařízení např. tiskárna), z dalších lze číst a do nich zapisovat, třeba i zárověň (např. zvuková karta).
Vnější zařízení jsou chápána pouze jako speciální soubory, které jsou umístěny většinou v adresáři /dev. Pro ilustraci následujících vět je dobré vyzkoušet příkaz ls -l /dev. Speciální soubory jsou buď blokově (např. pevný disk) nebo znakově orientované (např. tiskárna). Každý takový soubor má majoritní a minoritní číslo, které odkazují na příslušný řadič v jádře.
Nutno podotknout, že soubory v adresáři /dev jsou v každém unixu jinak pojmenované.
Již od roku 1980 jsou snahy o sjednocení rozvíjejících se unixů. Tyto snahy se postupně realizují v různé standardy. Zde si povíme o těch hlavních, které ovlivňují práci programátora.
Snahou normy ANSI C (byla uznána jako mezinárodní standard v roce 1990) je nabídnout přenositelnost programů v jazyce C na různé operační systémy, tedy nejen na unixy. Není zde definována pouze syntaxe a sémantika jazyka C, ale i knihovna standardních funkcí. Prototypy těchto funkcí jsou v 15 hlavičkových souborech -- viz též tab. 6.
IEEE POSIX je rodina norem, která se od svého vzniku kolem roku 1988 zatím stále rozvíjí. Formální název pro POSIX je Portable Operating System Interface for Computer Environment.
POSIX vychází sice z Unixu (hlavně ze Systemu V a BSD), ale sám to není operační systém. POSIX pouze definuje, jak spolu komunikuje aplikace a operační systém.
Pokud chcete psát aplikace přenositelné na největší množství hardwaru a operačních systémů, je POSIX způsob, jak toho dosáhnout.
Pro představu zde uvedeme některé členy rodiny POSIX:
XPG3 je zkratka X/Open Portability Guide, Issue 3 (1989). X/Open je mezinárodní skupina počítačových prodejců. XPG3 např. definuje některé věci, které ještě nejsou v POSIXu, viz tabulku 6.
| Hlavičky | ANSI C | POSIX.1 | XPG3 | Popis |
|---|---|---|---|---|
| <assert.h> | |
ověřuje asertivitu | ||
| <cpio.h> | |
archiv cpio | ||
| <ctype.h> | |
typy znaků | ||
| <dirent.h> | |
|
položky adresáře | |
| <errno.h> | |
chybové kódy | ||
| <fcntl.h> | |
|
ovládání souborů | |
| <float.h> | |
konstanty v plovoucí čárce | ||
| <ftw.h> | |
procházení stromu souborů | ||
| <grp.h> | |
|
soubor skupin | |
| <langinfo.h> | |
jazykové informace | ||
| <limits.h> | |
konstanty implementace | ||
| <locale.h> | |
lokální kategorie | ||
| <math.h> | |
matematické konstanty | ||
| <nl_types.h> | |
katalogy zpráv | ||
| <pwd.h> | |
|
soubor hesel | |
| <regex.h> | |
regulární výrazy | ||
| <search.h> | |
vyhledávací tabulky | ||
| <setjmp.h> | |
nelokální goto | ||
| <signal.h> | |
signály | ||
| <stdarg.h> | |
seznamy argumentů | ||
| <stddef.h> | |
standardní definice | ||
| <stdio.h> | |
standardní I/O | ||
| <stdlib.h> | |
pomocné funkce | ||
| <string.h> | |
operace s řetězci | ||
| <tar.h> | |
archiv tar | ||
| <termios.h> | |
|
terminálové I/O | |
| <time.h> | |
čas a datum | ||
| <ulimit.h> | |
uživatelská omezení | ||
| <unistd.h> | |
|
symbolické konstanty | |
| <utime.h> | |
|
časy souborů | |
| <sys/ipc.h> | |
IPC | ||
| <sys/msg.h> | |
fronty | ||
| <sys/sem.h> | |
semafory | ||
| <sys/shm.h> | |
sdílená paměť | ||
| <sys/stat.h> | |
|
status souboru | |
| <sys/times.h> | |
|
časy procesů | |
| <sys/types.h> | |
|
primitivní datové typy | |
| <sys/utsname.h> | |
|
jméno systému | |
| <sys/wait.h> | |
|
řízení procesů |
Systém souborů v unixu je tvořen hierarchickým uspořádáním adresářů a souborů. Vše začíná v adresáři, který se jmenuje root a označuje se /.
Adresář je soubor, který obsahuje jednotlivé položky adresáře. Každá položka obsahuje informace o souboru, tj. jméno, velikost, práva, ... (jen logicky, fyzicky je to většinou jinde).
Jména v adresářích se nazývají jména souborů. Pouze 2 znaky nesmí tvořit jméno souboru, a to / a NULL. Dvě jména se vždy automaticky vytvoří, a to . (tečka) a .. (tečka-tečka). Tyto soubory slouží pro odkaz na sebe a na svého rodiče.
Sekvence několika jmen souborů oddělených lomítky se nazývá cesta. Cesta začínající / se nazývá absolutní cesta, jinak se jedná o cestu relativní.
Každý proces má pracovní adresář. Pracovní adresář je takový adresář, ke kterému se vztahují relativní jména cest.
Domovský adresář je adresář, v němž se nacházíme ihned po přihlášení. Náš domovský adresář je uveden v souboru /etc/passwd.
Jádro se na všechny otevřené soubory odkazuje pomocí deskriptorů (popisovačů). Deskriptor je nezáporný malý integer. Jestliže chcete do souboru zapisovat nebo z něj číst, musíte soubor nejdříve vytvořit nebo otevřít. V unixu jsou některé deskriptory rezervovány.
Ladislav Dobias