POSIX X b. Přenositelné rozhraní pro Real-Time operační systémy

Podobné dokumenty
Práce s pamětí. Tématicky zaměřený vývoj aplikací v jazyce C skupina Systémové programování Linux. Martin Husák, Petr Velan, Martin Drašar

NPRG051 Pokročilé programování v C /17 Úkol 2

C++ a vnitřní svět. David Bednárek Jakub Yaghob Filip Zavoral

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

ZOS 9. cvičení, ukázky kódu. Pavel Bžoch

OS Konkurence procesů a IPC

Roury a zprávy Mgr. Josef Horálek

Metody připojování periferií BI-MPP Přednáška 2

Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Linux a vlákna - Linuxové noviny 8-9/1998. Linuxové noviny 08-09/98

3. Počítačové systémy

Open Source Programování

Procesy a vlákna Mgr. Josef Horálek

Základní principy konstrukce systémové sběrnice - shrnutí. Shrnout základní principy konstrukce a fungování systémových sběrnic.

Procesy a vlákna - synchronizace

Procesy a vlákna (Processes and Threads)

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Operační systémy. Tomáš Vojnar IOS 2009/2010. Vysoké učení technické v Brně Fakulta informačních technologií Božetěchova 2, Brno

Algoritmizace a programování

Architektura rodiny operačních systémů Windows NT Mgr. Josef Horálek

TG Motion verze 4 Modul Virtuální PLC návod k obsluze

OS Plánování procesů

OS Procesy a vlákna. Tomáš Hudec. Tomas.Hudec@upce.cz.

Souborové operace Mgr. Josef Horálek

Přednáška. Vstup/Výstup. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Výpočet v módu jádro. - přerušení (od zařízení asynchronně) - výjimky - softvérové přerušení. v důsledku událostí

Řada programovacích jazyků nabízí prostředky pro řešení meziprocesové komunikace jako je synchronizace a řízení přístupu do kritické sekce.

Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury

Š č ř č č ěř é ý ý ř ř ř č č ř ŠÍČ ý č Ň ě ř é ě š ě ý é ř č č Č Ů ě ý š ě č ě é š ř ě ý ě č úř ě č ý ě ý č ý

Linux Teorie operačních systémů a realita

š ř ž ů ř š ů ř Ž ř é Č ř ř ú Č ř ř ř é Č ř é ý é ýš ú Ť ý Í Ž Ž ú ú ň é ř Ž ř ů Ž ú ř Ž Ž ř ů ú ú Ž Ž ů ř é Č é é ž š é é ž š ř ř ř

Studijní osnova pro předmět: Programování v operačních systémech. Ing. Petr Olivka, Ph.D.

Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty

Pár odpovědí jsem nenašla nikde, a tak jsem je logicky odvodila, a nebo jsem ponechala odpověď z pefky, proto je možné, že někde bude chyba.

PB153 Operační systémy a jejich rozhraní

IUJCE 07/08 Přednáška č. 6

Management procesu I Mgr. Josef Horálek

Přerušovací systém s prioritním řetězem

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Práce se soubory. Základy programování 2 Tomáš Kühr

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Přidělování CPU Mgr. Josef Horálek

Operační systémy. Přednáška 4: Komunikace mezi procesy

TG Motion verze 4 Modul Virtuální PLC návod k obsluze

Přednášející: Zdeněk Kotásek. Ústav počítačových systémů, místnost č. 25

Struktura programu v době běhu

Česká letecká servisní a. s.

Architektura a koncepce OS OS a HW (archos_hw) Architektura a koncepce OS Jádro OS (archos_kernel) Architektura a koncepce OS Typy OS (archos_typy)

Konzistentnost. Přednášky z distribuovaných systémů

Paralelní programování

Vláknové programování část III

č ř ř č úř š ó č ř ý é č ř é ý ř ý ů č ý ý ú š ý é š é ý ýš ů ú é č é é ň č ř é ý é č ý ý é ů é ř é č é č ř ý ň ý ú ů é č úč é ř ú é š š ř ú ř é š ř š

ý ž ž ů ý ů ž ě ž é ř Č ž ý ů ř ř ě ě ýš ě é ř ě ž ž ě ř é ů ž é š ž ě ú ů ý é ž é ž ů ě ž é š ž ě ú ů ž ě é ť ň é ž ž é ž ž ý ý ů é š ž ě ú ů ž ě ž ý

Základní datové struktury

Systémy pro sběr a přenos dat

Meziprocesová komunikace

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Metody připojování periferií

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Í ž

Operační systémy Tomáš Hudec. 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu Obědvající filosofové

ý ď ř š ý ň Ú ž Ž ý ž ú ýš ú ú ů Ýš ř ý ý ž řš ý ý ž ř š Í Í Í ý ý ž ú ú ř ž ó ú ř š ř ý ř ž ů ý ý ř ýš ř ž ů ž řš ž šť ř ý ž ř ř ž ú ů ž ď ř š ž ž ž

ř ř é ř ř Ó é é č ř ř č é ř é ý č Í Ů ý č Ů ř ř ř ý ř ý ř é ý é é š Ú ř Š ř š ů ů ý č č š ř é ů ř č é č é č ř é ř ý é ř ý ý Í ř č é é č ř ř ř ř ý ž

PRINCIPY OPERAČNÍCH SYSTÉMŮ

OS Správa paměti. Tomáš Hudec.

Vlákno (anglicky: thread) v informatice označuje vlákno výpočtu neboli samostatný výpočetní tok, tedy posloupnost po sobě jdoucích operací.

B4B35OSY: Operační systémy

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

IUJCE 07/08 Přednáška č. 1

Přidělování zdrojů (prostředků)

ú ú Ž Č Č Č Ť ť

é ěž é é ý ý ěž ň é ň é é é ěž é ý é Ý ý ú ě é ú ě é ý ý ý ž ý ú ě ý ú ě é é Ž ý ěž é ó

Vstup a výstup datové proudy v C

PB153 OPERAČNÍ SYSTÉMY A JEJICH ROZHRANÍ

ř ů ť é ř é ď ř ý ž Ž é ž é úř Ž ď Í ž ř š é ý ů é ř ž ýů é ý ž é Ž ř ž ž ř š ď é é Ú Š ž ř Č Ž ř Ú Š ů ž ů ů ů é ř é ž ř é ů ů ž ůž ú é ř ů š ý ž Ú š

Pohled do nitra mikroprocesoru Josef Horálek

Vrstvy periferních rozhraní

Rozhraní SCSI. Rozhraní SCSI. Architektura SCSI

Poslední aktualizace: 21. května 2015

OS Správa paměti. Tomáš Hudec.

Í ž Í Ý Ž Ž Č Ú Í Í Í Ž Ž Ď Ž Ť ž Ť

ÚVOD DO OPERAČNÍCH SYSTÉMŮ

Vzájemné vyloučení procesů

RTOS VxWorks 6.x. Ing. Michal Sojka, Ing. Zdeněk Šebek Katedra řídicí techniky ČVUT FEL, Praha

Konstruktory a destruktory

Přednášející: Zdeněk Kotásek. Ústav počítačových systémů, místnost č. L322

Ř ů Á Ř č úč ý ý ý ú ý č é ř ú é č é é ý ě ř ě ý ů é ř ě é č č ň č ě č é úč ě ř Č č ů ě č é č č č ěř ý é ů č é é č ů ú é Č ř ý ě ř é č ň é ú ě é ř é š

č č é é é é é č é č Ó Š Í é é ž ú é é ž ú é ó č é ý ž ý č é š č é š Ž Ž é č é č Ž č ý š ý ý é š é ý š ý ů é č Š ů ó ž ý č é é Š é Ž é é é č é Ž ň é ž

Řízení IO přenosů DMA řadičem

Cvičení č. 2. Komunikace mezi procesy Program Hodiny. 4 body

Ě Ž

Opakování programování

Programování v OS Linux

é é ý ě č š é ď ě ď é ř ř é ť č řš řš ě č ě ý ěř č ý ěř ě ú ř ě č ě č ď ěř č ý ěř ě ú ř é ú č č Ž ě ř ě ř č ř ř ď čč ř ě č ýš é ř ěž č ř é ě š Ú ř š ě

ř ř Ý Á Ř Ě É ů ř é č é ž ň ř Č š č š ž ř ý ů ů ř ž š š š é ř ř ř ť č ú ž ř ů ý š ý é ř č š ý č š ž č č ů Š š é š é ň éč é é ů š Š Š é ř š ř ž ý Ů Č č

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

úč ů ů úč é Ž ýš ř é č ý ř ů ř úč ř ž é é é šť é é ř úč ž é é é šť é é ý é ž é Ž ý é ž é é é č ý ý ř ň é ř Ž é é é č ý ř č ý ň ý ř ý ý é ú ů é Ž ř ř ý

Jazyk PL/SQL Úvod, blok

Transkript:

POSIX X 1003.1b Přenositelné rozhraní pro Real-Time operační systémy

POSIX.1 a POSIX.4 povinné a volitelné části Mandatory Parts Optional Parts POSIX1003.1 POSIX.1 Base POSIX Chown Restricted POSIX Saved IDS POSIX NO Trunc POSIX 1003.1b SYNCH_I/O Shared Memory Realtime Signals POSIX.4 Base ASYNCH_I/O Message Queues Priority Scheduling Memory Locking Semaphores Timers

Posix 1003.1b - přehled Koordinační mechanismy Realtime signály Obecné semafory Sdílená paměť (a mapování souborů do paměti) Fronty zpráv Realtime hodiny a časovače Rozvrhování Zamykání paměti Asynchronní a synchronizované I/O

What s in the box (1) Kvalitativní vlastnosti = co je implementováno #include <unistd.h> konstanty ve tvaru _POSIX_, např. _POSIX_TIMERS, POSIX_MEMLOCK Kvantitativní vlastnosti = kolik toho je #include <limits.h> konstanty ve tvaru _MAX např. AIO_MAX, RTSIG_MAX

What s in the box (2) Zjišťování za běhu (run-time checking) #include <unistd.h> /* Parametry platné v rámci celého OS */ long sysconf(int option); /* Parametry závislé na adresář i/souboru */ long pathconf(char *pathname, int option); long fpathconf(int fd, int option);

POSIX 1003.1(b) - konvence rozhraní Pokud je návratový typ int pak návratová hodnota -1 znamená chybu, hodnota 0 úspěch Pokud je návratový typ ukazatel, je chyba indikována návratovou hodnotou NULL nebo -1 Je-li vracen speciální typ, lze jej často přetypovat na int a hodnota -1 indikuje chybu V případě chyby obsahuje globální proměnná errno chybový kód

Koordinace = synchronizace + komunikace Proces - jednotka izolace, běží na vlastním virtuálním OS izolován od svého okolí Komunikace - předávání dat mezi procesy Synchronizace - vzájemné sladění běhu procesů Koordinace - pojem sdružující vše co spadá pod synchronizaci i komunikaci IPC = koordinace mezi procesy

POSIX 1003.1 signály Nejzákladnější mechanismus Většina sig. rezervována pro potřeby OS Doručení není zaručeno Obsluha signálu = signal handler Dočasné blokování (maskování) Umožňuje čekat současně na více různých signálů

POSIX 1003.1 signály - rozhraní (1) /* Manipulace se množinami/maskami signál ů */ /* Získej prázdnou/plnou signálovou masku */ int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); /* Př idej/odeber/zjisti př ítomnost signálu v masce */ int sigaddset(sigset_t *set, int sig); int sigdelset(sigset_t *set, int sig); int sigismember(sigset_t *set, int sig);

POSIX 1003.1 signály - rozhraní (2) /* Nastav signálovou masku procesu */ int sigprocmask(int op, const sigset_t *set, sigset_t *oldset); /* Nastav obslužnou rutinu signálu */ int sigaction(int sig, const struct sigaction *sa, struct sigaction *old_sa); /* Pozastav proces do př íchodu signálu */ int sigsuspend(const sigset_t *new_mask); /* Zašli procesu signál */ int kill(pid_t victim_id, int sig);

POSIX 1003.1b realtime signály Definována vzájemná priorita RT signálů Zaručené doručení každé instance signálu RT Signál s sebou může nést data Použití ve spojení s časovači, zprávami a asynchronními I/O Ve spojení s časovači je lze použít pro limitování doby blokování procesu jinými IPC

POSIX 1003.1b realtime signály - rozhraní /* Zašli procesu signál */ int sigqueue(pid_t victim_id, int sig, union sigval extra_info); /* Př ijetí signálu */ int sigwaitinfo(const sigset_t *mask, siginfo_t *extra_info); int sigtimedwait(..., const struct timespec *timeout);

Obsluha chyb sběrnice struct jmp_buf jbuf; int f( int *x ) { /* Nastavení obsluhy signálu */ sigaction( SIGBUS, &sighnd, NULL ); /* Místo bezpeč ného návratu */ if ( 0!= setjmp( &jbuf ) ) return ERROR; void sighnd_fnc() { longjmp(jbuf, 1); } return value = 1 /* Př ístup na VME sbě rnici */ *x = *((int *) BUSERR_ADDR); } return OK; OS VxWorks přesměrovává procesorové výjimky (trap, exception) na signály. Ty je možné v rámci procesu ošetřit obsluhou signálu. U OS, které tuto možnost neposkytují dojde v takovémto případě k násilnému ukončení úlohy.

Fronty zpráv Mechanismus principiálně blízký člověku Globálně dostupný pojmenovaný objekt Není omezen počet procesů, které mohou do fronty zapisovat / z fronty číst Možnost definovat maximální velikost zprávy a kapacitu fronty Prioritizace zpráv ve frontě Možnost notifikace o příchodu zprávy do prázdné fronty realtime signálem

Fronty zpráv - rozhraní (1) /* Hlavič kový soubor */ #include <mqeue.h> /* Použitelné konstanty */ O_RDONLY, O_WRONLY, O_RDWR - frontu otevíráme pro čtení / zápis / čtení i zápis O_CREAT - pokud fronta neexistuje, je vytvořena O_EXCL - ve spoj. s O_CREAT vrátí chybu pokud fronta již existuje, test existence fronty O_NONBLOCK - čtení z prázdné / zápis do plné fronty nevede k pozastavení nýbrž vrací chybu MQ_PRIO_MAX - maximální použitelná priorita zprávy (>= 32)

Fronty zpráv - rozhraní (2) /* Otevř i/vytvo ř, zavř i, zruš frontu */ mqd_t mq_open(const char *mq_name, int oflag, mode_t creat_mode, struct mq_attr *creat_attr); int mq_close(mgd_t mqspec); int mq_unlink(const char *mq_name); /* Zapiš zprávu do fronty */ int mq_send(mqd_t mqspec, const void *pmsg, size_t lenmsg, int msgprio); /* Př eč ti z fronty zprávu */ size_t mq_receive(mqd_t mqspec, void *pbuf, size_t sizebuf, int *pmsgprio);

Fronty zpráv - rozhraní (3) /* Zjisti stavové informace fronty */ int mq_getattr(mqd_t mqspec, struct mq_attr *mq_attr); /* Zm ě ň ( č ást) stavové informace fronty */ int mq_setattr(mqd_t mqspec, const struct mq_attr *new_attr, struct mq_attr *old_attr); /* Př íjem notifikace o př íchodu zprávy */ int mq_notify(mqd_t mqspec, const struct sigevent *notify_spec);

Sdílená paměť Sdílená paměť je velice pružný IPC mechanismus s obrovskou šířkou pásma Sdílená paměť neobsahuje synchronizaci, většinou se používá spolu s jinými IPC Rozhraní je koncipováno jako speciální případ mapování souboru do paměti Rozšíření 1 - ochrana paměti Rozšíření 2 - synchronizace souborů mapovaných do paměti

Sdílená paměť - rozhraní (1) /* Hlavič kový soubor */ #include <sys/mman.h> /* Použitelné konstanty */ O_RDONLY, O_RDWR, O_CREAT, O_EXCL - viz. fronty zpráv O_TRUNC - zbytečný při vytváření (přítomen implicitně) PROT_NONE, PROT_READ, PROT_WRITE, PROT_EXEC - povol nic / čtení / zápis / výkon kódu ze sdílené paměti MAP_FIXED, MAP_SHARED, MAP_PRIVATE - namapování bloku sdílené paměti na určenou adresu / zápisy jsou viditelné / neviditelné ostatními

Sdílená paměť - rozhraní (2) /* Vytvo ř (otevř i), zavř i, zruš pojmenovaný blok sdílené pamě ti */ int shm_open(char *name, int oflag, mode_t mode); int close(int fd); int shm_unlink(const char *name); /* Nastavení velikosti sdílené pamě ti */ int ftrunc(int fd, off_t total_size); /* P ipoj(mapuj) do adresního prostoru procesu */ ř void * mmap(void *where_i_want_it, size_t length, int mem_protection, int map_flags, off_t offset_within_shared_mem);

Sdílená paměť - rozhraní (3) /* Odpoj pam ě ť z adresního prostoru procesu */ int munmap(void *begin, size_t length); /* Rozšíř ení: zm ě ň ochranu pro již př ipojenou sdílenou pam ě ť (pro celou nebo pro č ást) */ int mprotect(void *begin, size_t length, int mem_protecion); /* Rozšíř ení: sesynchronizuj pam ě ť s mapovaným souborem (pouze pamě ťové mapování soubor ů) */ int msync(void *begin, size_t length, int flags);

Obecné semafory Nejpružnější synchronizační mechanismus Ve spojení se sdílenou pamětí umožňují vytvářet složité komunikační mechanismy Pojmenovaná (named) i nepojmenovaná (memorybased) varianta Souborová konvence názvů pojmenovaných semaforů

Semafory - rozhraní (1) /* Hlavič kový soubor */ #include <semaphore.h> /* Použitelné konstanty */ SEM_VALUE_MAX - maximální dosažitelná hodnota semaforu (>= 32767) /* Použitelné konstanty, pojmenovaná varianta */ O_RDONLY, O_WRONLY, O_RDWR - viz. fronty zpráv O_CREAT, O_EXCL - viz. fronty zpráv

Semafory - rozhraní (2) /* Vytvo ř /zruš memory-based (nepojmenovaný) semafor */ int sem_init(sem_t *sema, int pshared, unsigned int initial_value); int sem_destroy(sem_t *sema); /* Př ipoj/otevř i, zavř i, zruš pojmenovaný semafor */ sem_t sem_open(const char *sem_name, int oflag, mode_t creat_mode, unsigned int init_val); int sem_close(sem_t *sema); int sem_unlink(const char *sem_name);

Semafory - rozhraní (3) /* Semaforové operace společ né pro pojmenovanou i nepojmenovanou variantu */ /* Vstup do kritické sekce - blokující/neblokující varianta */ int sem_wait(sem_t *sema); int sem_trywait(sem_t *sema); /* Opus ť kritickou sekci */ int sem_post(sem_t *sema); /* Zjisti hodnotu semaforu */ int sem_getvalue(sem_t *sema, int *value);

Srovnání koordinačních mechanismů Name Reliable? Flexible? Fast? Signals Sometimes Very No RT Signals Yes Very No (async)/yes (sync) Messages Yes Not very Not particularly Semaphores Yes Very Very (use w/sh. mem) Shared memory Yes Very Very (use w/sema.)

Tipy & triky Názvy pojmenovaných objektů vždy začínejte /, dále v názvu již tento znak nepoužívejte Existence pojmenovaného objektu ve chvíli, kdy jej chcete vytvořit často indikuje problémy. Pojmenované objekty vytvářejte s příznaky (O_CREAT O_EXCL) a v případě chyby testujte errno pro bližší informace.

Rozvrhovač Je-li k dispozici toto rozhraní, systém implementuje alespoň preemptivní prioritní (FIFO) a Round-Robin rozvrhování Možnost zvolit různé typy rozvrhování pro jednotlivé procesy Nastavení priority jednotlivých procesů Rozvrhování je dědičné

Rozvrhovač - rozhraní (1) /* Hlavič kový soubor */ #include <sched.h> /* Použitelné konstanty */ SCHED_FIFO - Preemtivní prioritní rozvrhování SCHED_RR - Preemtivní prioritní rozvrhování s časovými kvanty SCHED_OTHER - Jiné, implementačně závislé rozvrhování /* Zjisti a nastav typ rozvrhování procesu */ int sched_getscheduler(pid_t pid); int sched_setscheduler(pid_t pid, int policy, struct sched_param *params);

Rozvrhovač - rozhraní (2) /* Zjisti a nastav parametry rozvrhování */ int sched_getparam(pid_t pid, struct sched_param *params); int sched_setparam(pid_t pid, struct sched_param *params); int sched_rr_getinterval(pid_t pid, struct timespec *t); /* Explicitn ě vyvolej př eplánování */ int sched_yield(void); /* Zjisti minimální a maximální prioritu použitelnou s daným typem rozvrhování */ int sched_get_priority_min(int policy); int sched_get_priority_max(int policy);

Hodiny a časovače Hodiny slouží pro zjištění aktuálního času Časovače generují časové intervaly a periodické intervaly stejné délky Datový typ s rozlišením v nanosekundách Možnost zjistit časové rozlišení každého časovače Notifikace RT signálem při vypršení časovače Přetečení časovače jsou zaznamenávána

Hodiny a časovače - rozhraní (1) /* Hlavič kový soubor */ #include <time.h> /* Použitelné konstanty */ CLOCK_REALTIME - Systémové hodiny poskytující reálný čas /* POSIX.4 datový typ pro č as */ struct timespec { time_t tv_sec; /* sekundy (POSIX.1 typ) */ long tv_nsec; /* nanosekundy */ }; /* Typ pro č as, interval, č asové rozlišení */

Hodiny a - rozhraní (2) /* Zjisti rozlišení hodin */ int clock_getres(clockid_t clock_id); /* Zjisti aktuální č as hodin */ int clock_gettime(clockid_t clock_id, struct timespec *current_time); /* Nastav aktuální č as hodin */ int clock_settime(clockid_t clock_id, struct const timespec *new_time); /* Pozastav proces */ int nanosleep(const struct timespec *interval, struct timespec *remaining_time);

... a časovače - rozhraní (3) /* Vytvo ř /zruš č asova č */ int timer_create(clockid_t clock, struct sigevent *sigev, timer_t *created_timer); int timer_delete(timer_t timer_to_delete); /* Nastav/zjisti interval č asovač e */ int timer_settime(timer_t timer, int flags, const struct itimerspec *val,struct itimerspec *old); int timer_gettime(timer_t timer, struct itimerspec *oldvalue); /* Zjisti po et p ete ení asova e */ č ř č č č int timer_getoverrun(timer_t clock_id);

Zamykání paměti Zamknutím paměti lze zabránit nepredikovatelnému zpomalení částí kódu, které byly odloženy na disk Užitečné pro obsluhu časově kritických procesů Základní varianta - uzamkni veškerou paměť procesu Rozšířená varianta - uzamkni definovanou oblast paměti Použití varianty 2 závislé na kompilátoru/linkeru

Zamykání paměti - rozhraní (1) /* Hlavič kový soubor */ #include <sys/mman.h> /* Zamknutí/odemknutí veškeré pamě ti procesu */ int mlockall(int flags); int munlockall(void); /* Zamknutí/odemknutí oblasti pamě ti */ int mlock(void *address, size_t length); int munlock(void *address, size_t length);

Synchronní a asynchronní I/O Kdy jsou data opravdu na disku? (a na výstupu...) synchronizované I/O dává programu kontrolu Proč musím čekat na každého I/O? asynchronní I/O umožňuje provádět I/O operace paralelně s procesem řeší problém čekání na více současných I/O operací

Synchronní I/O - rozhraní (1) /* Hlavič kový soubor */ #include <unistd.h> /* Užiteč né konstanty */ F_GETFL - zjisti sync. režim souboru (POSIX.1) F_SETFL - změň sync. režim souboru (POSIX.1) O_NONBLOCK - operace read/write (ne-)pozastavují proces (POSIX.1) O_DSYNC - synchronizace dat při zápisu O_SYNC - O_DSYNC + sync. informace držené v inode O_RSYNC - synchronizace informací v inode pro čtení (O_SYNC ekvivalet pro čtení)

Synchronní I/O - rozhraní (2) /* Zm ě ň režim souboru (POSIX.1) */ int fcntl(int fd, int oper,...); /* Zapíše data i ř ídící informace souboru */ int fsync(int fd); /* Zapíše pouze data, nikoliv ř ídící informace (rychlejší, možné problémy př i havárii syst.) */ int fdatasync(int fd);

Asynchronní I/O - rozhraní (1) /* Hlavič kový soubor */ #include <aio.h> /* Řídící blok AIO operací */ struct aiocb { }; int aio_fildes; /*FD I/O zař ízení/souboru*/ off_t aio_offset; /* Pozice v souboru */ volatile void *aio_buf; /* read/write buffer */ struct sigevent aio_sigevent; /*notif. signal*/ int aio_lio_opcode; /* Požadovaná operace */ int aio_rqprio; /* AIO priorita */

Asynchronní I/O - rozhraní (2) /* Asynchronní vstup */ int aio_read(struct aiocb *read_aiocb); /* Asynchronní výstup */ int aio_write(struct aiocb *write_aiocb); /* Odvolání asynchronní operace */ int aio_cancel(struct aiocb *cancel_aiocb); /* Zjisti (chybový) stav ukonč ené AIO operace */ ssize_t aio_return(struct aiocb *cancel_aiocb); /* Zjisti aktuální stav probíhající/ukonč ené AIO operace, lze volat opakovan ě */ int aio_error(struct aiocb *cancel_aiocb);

Asynchronní I/O - rozhraní (3) /* Čekání na dokonč ení více souč asných operací */ int aio_suspend(struct aiocb *laiocb[], int nent, const struct timespec *timeout); /* Definované konstanty */ LIO_READ, LIO_WRITE, LIO_NOP - typ operace LIO_WAIT, LIO_NOWAIT - blokující/neblokující chování /* Více AIO č tení a zápis ů jedním voláním */ int aio_listio(int wait_or_not, struct aiocb * const laiocb[], int nent, struct sigevent *notification);

Literatura Gallmeister, Bill O.: POSIX.4: Programming for the Real World; O Reilly & Associates, Inc., 1995 Lewine, Donald: POSIX Programmer s Guide; O Reilly & Associates, Inc., 1991 Linux manpages VxWorks Programmer s Guide, 5.4; Wind River Systems, Inc., 1999