<< home >>
Svojvoľný úvod do programovania v jazyku C
<<- ->>


  • Nízkoúrovňový prístup, deskriptory, kompilácia knižníc, Makefile, ...

JAZYK C V OS LINUX

Tak tu je céčko "doma"

Nízkoúrovňový prístup

Download paklíku so súbormi

Programy 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žnice

Download paklíku so súbormi

Vytvorenie 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
<<- ->>