<< home >> |
Svojvoľný úvod do programovania v jazyku C |
<<- ->> |
|
|
|
|
JAZYK C V OS LINUXTak tu je céčko "doma"Nízkoúrovňový prístupDownload paklíku so súbormiProgramy pre nízkoúrovňový prístup k súborom - funkcie open, read, write a close. V súboroch 01.c a 02.c je niečo o deskriptoroch, o štandardnom vstupe, výstupe a chybovom výstupe. V súboroch 03.c a 04.c sú vytvorené deskriptory na súbory. Program 03 kopíruje vstupný súbor po 1B blokoch do výstupného súboru s atribútmi rwx------. Tento program je vhodné spustiť ako parameter príkazu time (vypíše čas potrebný na vykonanie programu). Program 04 je analógiou 03 avšak kopírovanie je realizované po 1kB blokoch. Program je vykonaný za kratší čas, než 03. 01.c #include <unistd.h> // write #include <stdlib.h> #include <stdio.h> // puts #include <string.h> // strlen int main(void) { char oznam[]="Deskriptor 1 označuje štandardný výstup\n"; char chyba[]="Deskriptor 2 označuje štandardný chybový výstup\n\a"; // funkcia puts automaticky odriadkuje puts("Deskriptor 0 označuje štandardný vstup"); // funkcia write vracia počet skutočne zapísaných bytov if (write(1, oznam, strlen(oznam)) != strlen(oznam)) { write(2, chyba, strlen(chyba)); exit(-1); } exit(0); } 02.c #include <unistd.h> #include <stdlib.h> #include <stdio.h> #define MAX_POCET_ZNAKOV 64 int main(void) { char vstupny_retazec[MAX_POCET_ZNAKOV]; int pocet_znakov; puts("Niečo zaťukaj na štandardný vstup"); pocet_znakov=read(0, vstupny_retazec, MAX_POCET_ZNAKOV); // 6 je počet bytov chybovej správy na štandardný chybový výstup if (pocet_znakov == -1) { write(2, "Chyba\n", 6); exit(-1); } // výpis a zároveň test či bol skutočne vypísaný celý vstupný reťazec if ((write(1, vstupny_retazec, pocet_znakov)) != pocet_znakov) { write(2, "Chyba\n", 6); exit(-1); } exit(0); } 03.c /* Nízkoúrovňové kopírovanie binárneho súboru po jedno kilobyteových * blokoch (je rýchlejšie a menej náročné na CPU než 03) * time ./04 */ #include <unistd.h> // open read write close #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> // konštanty O_RDONLY O_WRONLY O_CREAT O_TRUNC atď #include <stdlib.h> #include <stdio.h> #define MENO_IN "bin_file_input.mp3" #define MENO_OUT "bin_file_output.mp3" #define BLOCK 1024 int main(void) { char block[BLOCK]; int fd_in, fd_out; // deskriptory na súbory int pocet_bytov; // otvorenie vstupného súboru a vytvorenie deskriptoru naň // chybový výpis high_level na štandardný chybový výstup if ((fd_in=open(MENO_IN, O_RDONLY)) == -1) { fprintf(stderr, "Chyba neexistuje vstupný súbor %s\n\a", MENO_IN); exit(-1); } if ((fd_out=open(MENO_OUT, O_CREAT|O_WRONLY|O_TRUNC, S_IRWXU)) == -1) { fprintf(stderr, "Chyba nemôžem vytvoriť výstupný súbor %s\n\a", MENO_OUT); exit(-1); } while ((pocet_bytov=read(fd_in, block, sizeof(block))) > 0) { if ((write(fd_out, block, pocet_bytov)) == -1) { fprintf(stderr, "Chyba počas zápisu do súboru %s\n\a", MENO_OUT); close(fd_in); close(fd_out); unlink(MENO_OUT); // odstránenie súboru exit(-1); } } close(fd_in); close(fd_out); exit(0); } Kompilácia statickej knižniceDownload paklíku so súbormiVytvorenie a použitie statickej knižnice Vytvoríme zdrojové *.c súbory funkcií (fcia_1, fcia_2), ktoré chceme vopchať do knižnice a preložíme ich gcc s prepínačom -c. Zdrojové *.c súbory by mali includovať hlavičkár s deklaráciami "*.h" ("hlavickar.h") ak sme ho už skôr vytvorili $ gcc -c fcia_1.c fcia_2.c Vytvoríme hlavičkára "*.h" ("hlavicka.h"), ktorý deklaruje funkcie v súboroch *.c (fcia_1.c, fcia_2.c) a teda aj v našej tvoriacej sa statickej knižnici. Ak už je vytvorený, vopcháme incude naň do *.c súborov funkcií (fcia_1.c, fcia_2.c) a skompilujeme $ gcc -c fcia_1.c fcia_2.c Vytvoríme statickú knižnicu *.a (kniznica.a) príkazom $ ar crv kniznica.a fcia_1.o fcia_2.o Vytvoríme obsah knižnice príkazom $ ranlib kniznica.a Vytvoríme zdrojový súbor *.c s funkciou main() (main.c) kde includneme "*.h" ("hlavickar.h") a voláme funkcie (fcia_1, fcia_2). Pri kompilácií treba oznámiť, že sa má použiť aj naša nová knižnica *.a (kniznica.a) spôsobom $ gcc -o main main.c kniznica.a Alebo toto isté môžeme realizovať utilitkou make Makefile main: kniznica.a hlavickar.h gcc -o main main.c kniznica.a kniznica.a: fcia_1.o fcia_2.o hlavickar.h ar crv kniznica.a fcia_1.o fcia_2.o ranlib kniznica.a fcia_1.o: fcia_1.c hlavickar.h gcc -c fcia_1.c fcia_2.o: fcia_2.c hlavickar.h gcc -c fcia_2.c hlavickar.h void fcia_1(char *arg); void fcia_2(char *arg); fcia_1.c #include <stdio.h> #include "hlavickar.h" void fcia_1(char *arg) { printf("Toto je výpis z prvej funkcie fcia_1 %s\n", arg); } fcia_2.c #include <stdio.h> #include "hlavickar.h" void fcia_2(char *arg) { printf("Toto je výpis z druhej funkcie fcia_2 %s\n", arg); } main.c #include "hlavickar.h" int main(int argc, char *argv[]) { fcia_1(argv[1]); fcia_2("<viď README a všetky zdrojáky :-)>"); return(0); } Download paklíku s inými súbormi na kontrolu závislosti Makefile |
<<- ->> |
|
|