PB071 Programování v jazyce C



Podobné dokumenty
PB071 Programování v jazyce C

POSIX, Make, CMake. Miroslav Jaroš. PB071 Úvod do nízkoúrovňového programovnání. 29. dubna 2019

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Operační systémy. Cvičení 4: Programování v C pod Unixem

Paralelní programování

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

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

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

Operační systémy. Cvičení 5: Volání jádra, procesy, vlákna.

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Struktura programu v době běhu

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

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

GUIDELINES FOR CONNECTION TO FTP SERVER TO TRANSFER PRINTING DATA

Ukázka zkouškové písemka OSY

Základy programování (IZP)

Úvod do Operačních Systémů

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

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

Přednáška 8. Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. Úvod do Operačních Systémů Přednáška 8

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

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

Příkaz finger. # finger sam Login: sam Name: Sam Greenfield Directory: /home/sam Shell: /bin/tcsh Last login Sun Dec 25 14:47 (EST) on tty2 No Plan.

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

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

Procesy a vlákna - synchronizace

Základy programování (IZP)

Př. další použití pointerů

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

C2110 Operační systém UNIX a základy programování

A7B38UOS Úvod do operačních systémů. 6. Cvičení. Příkazy sed a awk

Programování v C++ 1, 1. cvičení

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

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

12. Správa souborů. ZOS 2006, L. Pešička

Operační systémy. Cvičení 3: Programování v C pod Unixem

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PROGRAMOVÁNÍ V C++ CVIČENÍ

10 Práce s řetězci - pokračování

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Algoritmizace a programování

Práce s knihovnami. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

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

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

Základy programování (IZP)

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

- jak udělat konstantu long int: L long velka = 78L;

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Úvod do OpenMP. Jiří Fürst

IRAE 07/08 Přednáška č. 7. Začátek (head)

Operační systémy. Cvičení 1: Seznámení s prostředím

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

Úvod do Operačních Systémů

Od CGI k FastCGI. Uvedené dílo podléhá licenci Creative Commons Uved te autora 3.0 Česko.

Základy programování (IZP)

Operační systémy 2 Základy Windows API

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

Procesy a vlákna (Processes and Threads)

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Přednáška 2. Systémy souborů OS UNIX. Nástroje pro práci se souborovým systémem. Úvod do Operačních Systémů Přednáška 2

Rozšiřování a upravování stávající funkcionality PLToolbox, Orafce

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

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

Textové soubory. alg9 1

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Mělká a hluboká kopie

Postup objednávky Microsoft Action Pack Subscription

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

C++ a vnější svět. David Bednárek Jakub Yaghob Filip Zavoral

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

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

Práce se soubory opakování

Úvod do Operačních Systémů

Operační systémy. Přednáška 2: Procesy a vlákna

Vstup a výstup datové proudy v C

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Struktury a dynamické proměnné

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

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

Základy programování (IZP)

User manual SŘHV Online WEB interface for CUSTOMERS June 2017 version 14 VÍTKOVICE STEEL, a.s. vitkovicesteel.com

Základy programování (IZP)

Abstraktní třídy, polymorfní struktury

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

Procesy a vlákna IPC Komunikace mezi procesy (IPC = Inter-Process Communication)

Programování v C++ 2, 8. cvičení

Management procesu I Mgr. Josef Horálek

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

Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')

Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A

Introduction to MS Dynamics NAV

Webový server lapache

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Transkript:

Programování v jazyce C POSIX

Organizační Zápočtový příklad nanečisto v tomto týdnu na cvičeních, 60 minut (naostro proběhne 5-11.5., čtvrtkové odpadnuté cvičení 15.5.) Pro účast na zkoušce je nutné mít zapsán zápočet v poznámkovém bloku Posun předtermínu zkoušky Z 15.5. na 16.5. 12:00 Posunuto z důvodu svátečního odpadnutí dvou čtvrtků (Lidé ze čtvrtečních skupin by se nemohli zúčastnit) Dnes POSIX Zvaná přednáška Juraj Michálek

POSIX

POSIX C library Snaha o vytvoření jednotného okolního prostředí (API) umožňující přenositelnost programů vyžadujících interakci s OS http://en.wikipedia.org/wiki/c_posix_library Knihovna funkcí pro interakci s OS, pokrývá širokou oblast kontrola procesů (spouštění, komunikace, ukončení) práce se vstupními a výstupními zařízeními (pipes...) práce s vlákny, synchronizační mechanismy (mutex) spouštění příkazů shellu... Historie POSIX.1 (1998) POSIX:2008 (aktuální norma)

POSIX - kompatibilita Unix/Linux dobrá dlouhodobá podpora, bez problémů každý certifikovaný UNIX splňovat jazyk C je součástí normy POSIX MS Windows omezená implementace funkcí ze standardu, jen některé distribuce... MS preferuje využívání svých funkcí Win32 API... Cygwin, MinGW implementace hlavní části POSIX normy pro Céčkové programy (pod Windows)

Práce se soubory a adresáři #include <dirent.h> Popisovač souborů (file descriptor) index do tabulky souborů v jádře OS (handle) DIR *opendir(const char *dirname); struct dirent *readdir(dir *dirp); int closedir(dir *dirp); Pozor, funkce mohou být stavové

(Ne)stavovost funkcí Jak vrátit jména pro 1001 souborů v adresáři? Jediným funkčním zavoláním? je nutné naformátovat jména do jediného řetězce Co použít jako oddělovač? speciální znak nepraktické, který zvolit? koncová nula? Používá se, jak byste udělali? Zavedení stavové funkce každé zavolání vrátí další soubor např. readdir() vrátí po každém zavolání další soubor v adresáři stav musí být uchováván (OS) a uvolněn!

Zjištění obsahu adresáře 1. Otevření adresáře (funkce opendir) vytvoří stavovou strukturu u OS (DIR) připojenou na daný adresář 2. Postupné procházení adresáře (funkce readdir) každé zavolání vrátí další soubor v adresáři formou struktury (struct dirent) 3. Práce s nalezeným souborem (struct dirent) dirent.d_name např. pomocí C funkce fopen() 4. Ukončení práce s adresářem (funkce closedir) uvolní stavovou strukturu u OS

Výpis obsahu adresáře void PosixPrintFiles(const char* path) { DIR *dir = NULL; if ((dir = opendir(path))) { // connect to directory struct dirent *direntry = NULL; while ((direntry = readdir(dir))!= NULL) {// obtain next item printf("file %s\n", direntry->d_name); // get name } closedir(dir); // finish work with directory } } Jak rozlišit podadresář od souboru? Jak zjistit další informace o souboru? (čas, práva) Jak projít zanořenou strukturu adresářů?

Rozlišení adresáře od souboru Problém v rozdílné podpoře v Unixu / Windows Linux: struct dirent.d_type 4, 10 adresář, 8 soubor makro S_ISDIR, funkce stat nebo lstat <sys/stat.h> Windows: omezená podpora, dirent.d_type nemusí být dostupný např. není defaultně v MinGW zkusit otevřít položku pomocí opendir() #define DT_UNKNOWN 0 #define DT_DIR 4 #define DT_REG 8 #define DT_LNK 10 pokud se nepodaří, nemusí být adresář (proč?)

Převzato z http://pubs.opengroup.org/onlinepubs/009696699/functions/stat.html struct dirent *dp; struct stat statbuf; struct passwd *pwd; struct group *grp; struct tm *tm; char datestring[256];... // Open directory opendir etc. /* Loop through directory entries. */ while ((dp = readdir(dir))!= NULL) { /* Get entry's information. */ if (stat(dp->d_name, &statbuf) == -1) continue; /* Print out type, permissions, and number of links. */ printf("%10.10s", sperm (statbuf.st_mode)); printf("%4d", statbuf.st_nlink); /* Print out owner's name if it is found using getpwuid(). */ if ((pwd = getpwuid(statbuf.st_uid))!= NULL) printf(" %-8.8s", pwd->pw_name); else printf(" %-8d", statbuf.st_uid); /* Print out group name if it is found using getgrgid(). */ if ((grp = getgrgid(statbuf.st_gid))!= NULL) printf(" %-8.8s", grp->gr_name); else printf(" %-8d", statbuf.st_gid); /* Print size of file. */ printf(" %9jd", (intmax_t)statbuf.st_size); } tm = localtime(&statbuf.st_mtime); /* Get localized date string. */ strftime(datestring, sizeof(datestring), nl_langinfo(d_t_fmt), tm); printf(" %s %s\n", datestring, dp->d_name);

Vlákna v POSIXu Vlákna umožňují spustit několik úkolů paralelně při jednom jádře CPU se střídají při více jádrech CPU mohou běžet paralelně Pracovní vlákno (Worker thread) funkce obsahující kód pro vykonání data předaná při spuštění funkci jako argument spuštění potřebného počtu vláken Použití vláken může vyžadovat synchronizaci ochrana před nevhodným souběžným použitím zdrojů zápis do paměti, přístup k souboru... https://computing.llnl.gov/tutorials/pthreads/ http://www.yolinux.com/tutorials/linuxtutorialposixthreads.html

#include <stdio.h> #include <stdlib.h> #include <pthread.h> funkce pro vlákno void *print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s \n", message); } spuštění vlákna zpracování argumentu funkce pro vlákno int main() { pthread_t thread1, thread2; char *message1 = "Thread 1"; char *message2 = "Thread 2"; int iret1, iret2; struktura pro kontrolu vlákna /* Create independent threads each of which will execute function */ iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2); počkáme na dokončení vláken /* Wait till threads are complete before main continues. Unless we */ /* wait we run the risk of executing an exit which will terminate */ /* the process and all threads before the threads have completed. */ pthread_join( thread1, NULL); pthread_join( thread2, NULL); argument pro funkci printf("thread 1 returns: %d\n",iret1); printf("thread 2 returns: %d\n",iret2); return 0; } Převzato Úvod do C, a upraveno 28.4.2014 z http://www.yolinux.com/tutorials/linuxtutorialposixthreads.html

Další funkce POSIXu Naleznete v přednášce Návaznost jazyka C na OS (Šimon Tóth), web předmětu http://cecko.eu/_media/public/prednaska_posix_2012.pdf

Zvaná přednáška Juraj Michálek