11. előadás (2005. május 10.)

21
11. előadás (2005. május 10.) A make segédprogram Alacsony szintű műveletek és bitmezők Fájl, katalógus rendszer hívások 1

Upload: ronia

Post on 25-Jan-2016

29 views

Category:

Documents


1 download

DESCRIPTION

11. előadás (2005. május 10.). A make segédprogram Alacsony szintű műveletek és bitmezők Fájl, katalógus rendszer hívások. 1. make. A make segédprogram (utility) egy intelligens program menedzser, amellyel megőrizhetjük egy modulokból álló program integritását. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 11. előadás (2005. május 10.)

11. előadás (2005. május 10.)

• A make segédprogram

• Alacsony szintű műveletek és bitmezők

• Fájl, katalógus rendszer hívások

1

Page 2: 11. előadás (2005. május 10.)

make

A make segédprogram (utility) egy intelligens program menedzser, amellyel megőrizhetjük egy modulokból álló program integritását.

Nem a C (vagy más) nyelv része.Pl.main.c f1.c ......... fn.ccc -o main main.c f1.c ......... fn.c

Csak a megváltozottakat:cc -o main main.c f1.c ... fi.o .. fj.o ... fn.c

(cc -c main.c a main.o előállítására)

Időrabló, fáradságos, hibaforrás.

2

Page 3: 11. előadás (2005. május 10.)

make programozás

A make program egy sor parancs, ami leírja, hogy hogyan lehet a programot a forrás fájlokból felépíteni.

A make program fájl függőségi és kontrukciós szabályokat tartalmaz.

Függőségi szabály:bal oldal : jobb oldal

A bal oldal az előállítandó célfájlok neveit adja meg, míg a jobb oldal megadja azokat a fájlneveket, melyektől a cél függ.

Ha a cél dátuma korábbi mint az alkotóké, akkor a make a függőségi szabályokat követő konstrukciós előírásokat végrehajtja.

3

Page 4: 11. előadás (2005. május 10.)

make programozás

Megj.: a make fájlok minden olyan parancsot végrehajtanak, amit parancssorban kiadhatunk (pl. backup fájl készítése).

A make fájl bármely szövegszerkesztővel létrehozható.Pl.prog: prog.o f1.o f2.o   cc -o prog prog.o f1.o f2.o -lm

prog.o: header.h prog.c cc -c prog.c  

f1.o: header.h f1.c cc -c f1.c  

f2.o: --- ----

Explicit szabályok: megnevezzük a fájlokat. 4

Page 5: 11. előadás (2005. május 10.)

make programozásImplicit szabályok, pl.:f1.o: f1.c   

cc -c f1.c  

f2.o: f2.c

cc -c f2.c általánosítható:

.c.o:   cc -c $<

.forrás_kiterjesztés .cél_kiterjesztés : parancs

$< a .c kiterjesztést jelenti

# a sor megjegyzés

5

Page 6: 11. előadás (2005. május 10.)

make programozás

A make több a Unix parancsokhoz hasonló beépített, vagy tényleges Unix paranccsal rendelkezik, pl.:

break, date, mkdir,

type, chdir, cp(copy),

mv(move or rename),

cd, rm(remove), ls, path

6

Page 7: 11. előadás (2005. május 10.)

make makrók

Makrók definiálhatók forrásfájl nevek, objectfájl nevek, compiler opciók és könyvtár linkek tárolására:

SOURCES = main.c f1.c f2.c

CFLAGS = -g -C

LIBS = -lm

PROGRAM = main

OBJECTS = (SOURCES: .c = .o)

,ahol a (SOURCES: .c = .o) a SOURCES .c kiterjesztését .o -vá teszi.

7

Page 8: 11. előadás (2005. május 10.)

make programozás

Makró hívása: $(makrónév), pl.:

$(PROGRAM) : $(OBJECTS) Egy sor függőséget és célt állít fel.

$(LINK.C) -o $@ $(OBJECTS) $(LIBS)

Néhány belső makró:

$* az aktuális függő fájl neve (kiterjesztés nélkül)

$@ az aktuális cél teljes neve

$< a cél .c fájlja

8

Page 9: 11. előadás (2005. május 10.)

make futtatása

Parancssorban: make

automatikusan az aktuális könyvtárban a Makefile nevű fájlt keresi és hajtja végre.

Felülbírálható:

make -f make_fájlnév

Pl.:

make -f sajat_make

További opciók a kézikönyvekben, pl. a gnu.org -ról kiindulva.

Példák forrása: Dave Marshall

9

Page 10: 11. előadás (2005. május 10.)

Alacsony szintű műveletek és bitmezők

Bitenkénti műveletek:

& (AND), | (OR), ^ (XOR), ~ (egyes komplemens)

<< (balra tolás), >> (jobbra tolás)

Bitmezők

Memória takarékosság céljából használjuk:

- egybites információ tárolására: flag (pl. compiler szimbólumtábla)

- nem szabványos külső fájl formátum olvasásakor, pl. 9 bites egész

10

Page 11: 11. előadás (2005. május 10.)

Bitmezők

Deklarációja, pl.:struct packed_struct {

unsigned int f1:1;

unsigned int f2:1;

unsigned int f3:1;

unsigned int f4:1;

unsigned int type:4;

unsigned int funny_int:9;

} pack;

A C a lehető legtömörebben tárolja a fenti bitmezőket, feltéve, hogy a mezők maximális hossza kisebb vagy egyenlő a gép egész szavánál. Kompatibilitás!

11

Page 12: 11. előadás (2005. május 10.)

Bitmezők

Tagok elérése a szokásos módon, pl.:pack.type = 7;

Megj.:

- csak az n alsó bit rendelődik egy n bites mezőhöz

- a bitmezők mindíg egésszé konvertálódnak a számítások során

- a standard típusok és a bitmezők vegyesen használhatók

- az unsigned definíció fontos

12

Page 13: 11. előadás (2005. május 10.)

Bitmezők használata: diszk kontroller

Az eszközvezérlő regiszterei egy egész szóba pakolhatók (Dave Marshall):

13

Page 14: 11. előadás (2005. május 10.)

Bitmezők használata: diszk kontroller

A regiszter definíciója:struct DISK_REGISTER {

unsigned ready:1;

unsigned error_occured:1;

unsigned disk_spinning:1;

unsigned write_protect:1;

unsigned head_loaded:1;

unsigned error_code:8;

unsigned track:9; unsigned sector:5;

unsigned command:5;

};

14

Page 15: 11. előadás (2005. május 10.)

Bitmezők használata: diszk kontroller

A diszk regiszter memória címre definíálunk egy pointert:

struct DISK_REGISTER *disk_reg =

(struct DISK_REGISTER *) DISK_REGISTER_MEMORY;

Kódrészlet pl. olvasásra:

15

Page 16: 11. előadás (2005. május 10.)

Bitmezők használata: diszk kontroller

/* Define sector and track to start read */

disk_reg->sector = new_sector;

disk_reg->track = new_track;

disk_reg->command = READ;

/* wait until operation done, ready will be true */

while ( ! disk_reg->ready ) ;

/* check for errors */

if (disk_reg->error_occured)

{ /* interrogate disk_reg->error_code for error type */

switch (disk_reg->error_code) ...... }

16

Page 17: 11. előadás (2005. május 10.)

Bitmezők: portabilitás

Gondok:

- az egészek lehetnek signed vagy unsigned

- sok compiler a bitmező hosszát az int típus méretére korlátozza: 16 vagy 32 bit

- bizonyos bitmezőket balról-jobbra, másokat jobbról- balra tárolnak a memóriában

- ha a bitmező túl nagy, akkor a következő bitmező közvetlenül utána, vagy a következő szóban kezdődhet.

17

Page 18: 11. előadás (2005. május 10.)

Bitmezők: portabilitásHa a portabilitás fontos, akkor használjuk a bit shift-et és

a maszkolást, pl.:unsigned int *disk_reg = (unsigned int *)

DISK_REGISTER_MEMORY;

/* see if disk error occured */ disk_error_occured = (disk_reg &

0x40000000) >> 31;

18

Page 19: 11. előadás (2005. május 10.)

Fájl, katalógus rendszer hívások

A cd, ls, rm, cp, mkdir, stb. megvalósítása C programból.

Katalógus kezelő függvények<unistd.h>

Katalógus váltásint chdir(char *path)

Munkakatalógus lekérdezése (teljes útvonal)char *getwd(char *path)

Hiba: NULL

A Unix cd parancsának C emulációja:19

Page 20: 11. előadás (2005. május 10.)

Fájl, katalógus rendszer hívások#include<stdio.h>

#include<unistd.h>  

main(int argc,char **argv)    

if (argc < 2)

{  printf("Usage: %s   <pathname \n",argv[0]);

exit(1);

}

if (chdir(argv[1]) != 0)

{ printf("Error in chdir \n"); exit(1);

}

}

20

Page 21: 11. előadás (2005. május 10.)

Fájl, katalógus rendszer hívásokFájl hozzáférés meghatározása: int access(char *path, int mode)

mode:

R_OK - olvasási engedély

W_OK - írási engedély

X_OK - végrehajtás vagy keresés engedély

F_OK - a fájlhoz vezető út kereshető és létezik-e

0 sikeres, -1 hiba és errno beállítás

És így tovább...

21