Processzállapotok
UNIX rendszer felhasználói és fejlesztői felülete (11-16. ea.)
esemény beköv.
Futásra kész
Várakozik
futás megszakad
van elég memória
elindul
eseményre vár User fut
létrejön
Start
Szeberényi Imre
megáll
Kernel fut
BME IIT
nincs elég memória
<
[email protected]>
aktivál
felfüggeszt
Felfüggesztve kész
Zombie
felfüggeszt esemény beköv.
megszűnik Felfüggesztve várakozik
PASSZÍV ÁLLAPOTOK
MŰEGYETEM 1782 UNIX alapok © BME-IIT Sz.I.
© BME-IIT Sz.I.
2012.10.10-26.
-1UNIX alapok
© BME-IIT Sz.I.
Adatszerkezetek
• •
–
–
• •
•
osztható kód (írásvédett) osztható dinamikus könyvtár nem osztható kód
•
–
•
inicializált adat (DATA) nem inicializált adat (BSS) /dinamikusan növelhető/ verem (STACK) © BME-IIT Sz.I.
2012.10.10-26.
• • -3-
UNIX alapok
© BME-IIT Sz.I.
• • • • • • • • • 2012.10.10-26.
regiszterek tartalma nyitott állományok pointerei munkakatalógus információ kernel verem © BME-IIT Sz.I.
2012.10.10-26.
-4-
Kapcsolódó rendszerhívások
pid, ppid uid, gid, euid, egid umask sigprocmask megnyitott állományok munkakatalógus környezeti változók
UNIX alapok
azonosítók (PID, PPID, UID, GID) tárkezelés információi ütemezés információi
u terület (nincs mindig a tárban) •
Processz attribútumai • • • • • • •
folyamat tábla bejegyzés (mindig tárban van) •
adatterületek: •
UNIX alapok
• kernel szintű környezet:
a program kódja •
-2-
Adatszerkezetek/2
Belső adatszerkezetek, a környezet elemei • felhasználói szintű környezet: –
2012.10.10-26.
-5-
fork - új processz létrehozása exit - processz megállítása exec - processz helyettesítése új pr.kóddal wait - várakozás (gyerek) processzre vfork - hatékonyabb fork, de veszélyes sleep - adott ideig vár signal, kill, sigaction - eseménykezelés prof - folyamat megfigyelése ptrace - felügyelt futtatás
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
-6-
1
fork – új processz létrehozása
fork() minta #include <stdio.h> #include
main(int argc, char *argv[]) { pid_t pid; if ((pid = fork()) < 0) { printf("Baj van!\n"); exit(1); }
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
-7-
UNIX alapok
fork() minta/2
© BME-IIT Sz.I.
2012.10.10-26.
-8-
exec – program indítás
if (pid == 0){ printf("Megszulettem!\n"); exit(0); } else { printf("Apa lettem!\n"); exit(0); } } UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
-9-
UNIX alapok
exec() minta
© BME-IIT Sz.I.
2012.10.10-26.
- 10 -
ls > f1 parancs végrehajtása
#include <stdio.h> #include main(int argc, char *argv[]) { if (execl("/bin/ls","ls","-la",NULL) < 0){ printf("Baj van!\n"); exit(1); } else { printf("Ide nem juthat!\n"); } }
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 11 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 12 -
2
Ősfolyamat (init)
Processzek közötti kommunikáció
Feladatai: • A rendszer indításához szükséges startup scriptek elindítása, amelyek: – – –
Lehetséges eszközök • ptrace (debug célokra) • signal (jelzések adására) • pipe (csővezeték) • shared memory (SystemV) • message queue (SystemV) • semaphore (SystemV) • socket (BSD)
inicializálják az egyes sw. és hw. komponenseket elindítják a daemon folyamatokat elindítják a getty programokat
• “árva folyamatok” befogadása • “állandó” várakozás, • a megálló ciklikus folyamatok újraindítása (getty)
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 13 -
UNIX alapok
ptrace() példa
© BME-IIT Sz.I.
2012.10.10-26.
- 15 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 16 -
Szignál megvalósítási probléma BSD • Marad a handler ill. az akció
main(int argc, char *argv[]) { signal(SIGUSR1, handler); signal(SIGUSR2, handler); for(;;); }
© BME-IIT Sz.I.
- 14 -
#include <stdio.h> #include <signal.h> void handler(int sig) { //sigal(sig, handler); if (sid == SIGUSR1) printf("TI-"); else printf("TA-"); fflush(stdout); }
signal() példa/2
UNIX alapok
2012.10.10-26.
signal() példa
... if ((pid = fork()) == 0) { ptrace(PTRACE_TRACEME, 0, 0, 0); execl("nev", arg0, arg1, NULL); } wait(&st); data = ptrace(PTRACE_PEEKDATA, pid, ADDR, 0); data = ptrace(PTRACE_PEEKUSER, pid, RADR, 0); ... UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
SystemV • Visszaáll az eredeti POSIX • Sigaction megoldás, ami közelebb áll a hw. IT szemlélethez (mask)
- 17 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 18 -
3
POSIX szignál
sigaction() példa #include <stdio.h> #include <signal.h> void handler(int sig) { if (sid == SIGUSR1) printf("TI-"); else printf("TA-"); fflush(stdout); }
Szignál érkezik
Normál végrehajtás
Normál végrehajtás
maszk = M1
maszk = M1 Szignál kezelő M2 maszkkal
maszk = M1∪ ∪M2∪ ∪[akt. szignál] UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 19 -
UNIX alapok
sigaction() példa/2
© BME-IIT Sz.I.
2012.10.10-26.
main(int argc, char *argv[]) { int fd[2]; char buff[100]; - 21 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 22 -
pipe() megvalósítás
pipe(fd); if (fork() == 0) { write(fd[1], duma, sizeof(duma); } else { if(read(fd[0],buff,sizeof(buff))>0) printf(buff); } }
© BME-IIT Sz.I.
- 20 -
#include #include <stdio.h> char duma[] = "Uzenet";
pipe() példa/2
UNIX alapok
2012.10.10-26.
pipe() példa
main(int argc, char *argv[]) { struct sigaction sig; sigset_t set1; sigemptyset(&set1); sig.sa_handler = handler; sig.sa_mask = set1; sig.sa_flags = 0; //SA_NODEFER sigaction(SIGUSR1, &sig, NULL); sigaction(SIGUSR2, &sig, NULL); for(;;) sleep(1); } UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 23 -
Véges méretű FIFO, melyet a rendszer egy valós állományrendszer felett hoz létre, így normál állományként látszik a programok (rendszerhívás felület) számára. Lépések: • i-node allokáció • fájltábla bejegyzés (író, olvasó) • fájlleíró allokáció • író/olvasó pointert FIFO algoritmussal kezeli UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 24 -
4
Named pipe
SystemV IPC Mindhárom eszköz hasonló felülettel rendelkezik: • Egy belső táblában (nem a fájltáblában) történik az adminisztráció. • Numerikus kulcs azonosít, nem név. • “get” mechanizmussal lehet egy új, vagy régi táblabejegyzéshez megkapni az azonosítót (descriptor), mely a további műveletek végzéséhez szükséges. Ez azonban nem használható a fájlműveletek rendszerhívásaival. • Az állományrendszerhez hasonló védelmi mechanizmus van. • Külön kontrol funkcióval lehet változtatni a paramétereket. • A hívások blokkolódnak, de lehet azonnali visszatérést is kérni (IPC_NOWAIT).
Named pipe esetében a különbség az, hogy az allokált i-node-ra az állományrendszerből egy névhivatkozás is van. Ezért az megjelenik a fájlhierarchiában. Megjegyzések: • Az írásra nyitó process vár, amíg az olvasó meg nem nyitja ill. fordítva. • Az állományrendszer védelmi mechanizmusa szabályozza a hozzáférést.
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 25 -
UNIX alapok
SystemV IPC/2
© BME-IIT Sz.I.
2012.10.10-26.
- 27 -
UNIX alapok
2012.10.10-26.
- 28 -
main(int argc, char *argv[]){ struct msgtyp msg; int msgid;
<stdio.h> <sys/types.h> <sys/ipc.h> <sys/msg.h>
© BME-IIT Sz.I.
© BME-IIT Sz.I.
Üzenetek példa/2
msgid = msgget(6123, 0666|IPC_CREAT); msg.mtype = 1; strcpy(msg.mtext, duma); msgsnd(msgid, &msg, sizeof(duma), 0); msgrcv(msgid, &msg, 100, 1, 0); printf("Uzenet:", %s\n, msg.mtext); msgctl(msgid, IPC_RMID, 0);
struct msgtyp { long mtype; char mtext[100]; }; char duma[] = ”Hello”; UNIX alapok
- 26 -
• Minden üzenethez tartozik egy azonosító (típus). • A vevő egy meghatározott üzetettípust is tud venni. • A típus felhasználásával egyetlen üzenetsort használva több processz is kommunikálhat egymással. • Általában konfiguráció függő a rendszerben használható üzenetsorok száma, és azokban levő üzenetek mennyisége. • Alapértelmezés szerint mind az üzenet küldés, mind a vétel blokkolódik. • Nem szabadul fel a sor automatikusan, ha a küldő és/vagy a vevő processz megáll!
Üzenetek példa #include #include #include #include
2012.10.10-26.
Üzenetek
• Nem használhatók hálózat felett. • A rendszer nem tartja nyilván, hogy mely mechanizmust mely processz használja, így azok nem szabadulnak fel automatikusan a processz megállásakor. Ez esetenként lehet hasznos, vagy kívánatos is. Ugyanakkor így könnyen előfordulhat, hogy olyan erőforrást kötnek le a rendszerben, amire már nincs szükség. • A legtöbb esetben más eszközzel is kiválthatók lennének, de nem hatékonyan.
UNIX alapok
© BME-IIT Sz.I.
} 2012.10.10-26.
- 29 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 30 -
5
Közös memória
Közös memória példa
• A processz virtuális címteréhez kapcsolható memória, amelyet több processz is használhat egyszerre. • A processz különböző címterületéhez csatolható. Leggyakrabban a rendszerre bízzák a címválasztást, mivel olyan címre van szükség, ami sem a BSS, sem a STACK növekedését nem gátolja. • A normál memóriához hasonlóan írható, olvasható (a védelmi jogoknak megfelelően) • Nem szabadul fel a memória automatikusan, ha a létrehozó/használó processz megáll! • Felszabadításkor csak akkor törlődik, ha nem hivatkozik rá egy processz sem.
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
#include #include #include #include
<stdio.h> <sys/types.h> <sys/ipc.h> <sys/shm.h>
char duma[] = "Hello"; main(int argc, char *argv[]) { int shmid; char *addr1, *addr2; - 31 -
UNIX alapok
Közös memória példa/2
© BME-IIT Sz.I.
2012.10.10-26.
- 32 -
Szemafor • Klasszikus szinkronizációs eszköz. Ennek hiányában a korábban a creat rendszerhívást használták a processzek közötti szinkronizációra. • A klasszikus Dijkstra féle szemafor általánosításának fogható fel a SystemV megvalósítás. • Müveletek: csökkentés (P), növelés (V), tesztelés • Egyszerre több szemaforon is végezhető művelet. Minden művelet atomi, és csak akkor hajtódik végre, ha mind végrehajtható (Deadlock elkerülés). • A processz megállásakor automatikusan csak akkor szabadul fel (undo), ha a műveleteket SEM_UNDO flag mellett hajtotta végre a processz.
shmid = shmget(3456, 1024, 0666|IPC_CREAT); addr1 = shmat(shmid, 0, 0); addr2 = shmat(shmid, 0, 0); strcpy(addr1, duma); printf("Uzenet:", %s\n, addr2); shmdt(addr1); shmdt(addr2); shmctl(shid, IPC_RMID, 0); } UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 33 -
UNIX alapok
Szemafor példa #include #include #include #include
- 34 -
semid = semget(1123, 5, 0666|IPC_CREAT); if (argc < 3) { semctl(semid, 0, IPC_RMID, 0); } else { s.sem_num = atoi(argv[1]); s.sem_op = atoi(argv[2]); s.sem_flg = 0; /* SEM_UNDO kellene! */ semop(semid, &s, 1); }
<stdio.h> <sys/types.h> <sys/ipc.h> <sys/sem.h>
© BME-IIT Sz.I.
2012.10.10-26.
Szemafor példa/2
main(int argc, char *argv[]) { struct sembuf s; int semid; UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
}
- 35 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 36 -
6
Socket
Socket modell rétegei
• Hatékony, hálózat felett is alkalmazható, kétirányú kommunikációs csatorna. • Támogatja a kliens - szerver architektúrát. • A különböző protokollokat, és kommunikációs módszereket ún. domain-ekbe sorolják (UNIX system domain, Internet doamain). • Virtuális áramkör jellegű (stream) vagy datagram jellegű átvitelt támogat. • Stream jellegű átvitel esetén a normál read, és write utasítások is használhatók, így egy programnak nem is kell tudnia arról, hogy a hálózat felett kommunikál a másik programmal. UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 37 -
Protokoll réteg (IP)
Protokoll réteg (IP)
Device driver (ethernet)
Device driver (ethernet)
© BME-IIT Sz.I.
Kliens processz
© BME-IIT Sz.I.
2012.10.10-26.
listen addr
- 39 -
UNIX alapok
© BME-IIT Sz.I.
accept() accept addr
2012.10.10-26.
- 40 -
msd = socket(AF_INET, SOCK_STREAM, 0); a.sin_family = AF_INET; a.sin_addr.s_addr = INADDR_ANY; a.sin_port = 0; i = sizeof(a); bind(msd, (struct sockaddr *)&a, i); getsockname(msd, &a, &i); printf("S_port:%d\n", ntohs(a.sin_port)); listen(msd, 5);
main(int argc, char *argv[]) { int msd, csd, i; struct sockaddr_in a; char buf[512]; 2012.10.10-26.
- 38 -
Socket példa /szerver/ 2
<stdio.h> <sys/types.h> <sys/socket.h>
© BME-IIT Sz.I.
2012.10.10-26.
Szerver processz
connect() accept addr
Socket példa /szerver/
UNIX alapok
Socket réteg (TCP)
A kapcsolat létrejött
Szerver processz listen addr
#include #include #include #include
Socket réteg (TCP)
UNIX alapok
connect()
UNIX alapok
Szerver processz
Hálózat
Kapcsolat felépítés Kliens processz
Kliens processz
- 41 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 42 -
7
Socket példa /szerver/ 3
Socket példa /kliens/
for (;;) { csd = accept(msd, 0, 0); if (fork() == 0) { close(msd); if ((i=read(csd,buf,sizeof(buf))) > 0){ write(csd, buf, i); printf(buf); } exit(0); } close(csd); }
#include #include #include #include #include #include
char duma[] = "Hello\n";
} UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 43 -
UNIX alapok
Socket példa /kliens/ 2
2012.10.10-26.
- 45 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 46 -
select() Egyszerre több fájlműveletre vár.
• Gyakran egy program több helyről vár inputot. • Nem várakozhat, mert nem tudni, hogy mi a helyzet a másik inputtal. • Nem blokkolódó I/O + poll • Select
© BME-IIT Sz.I.
- 44 -
}
IO multiplex
UNIX alapok
2012.10.10-26.
if ((hp = gethostbyname(argv[1])) == NULL) exit(2); memcpy(&a.sin_addr.s_addr, hp->h_addr, hp->h_length); a.sin_port = htons(atoi(argv[2])); connect(sd, &a, sizeof(a)); write(sd, duma, sizeof(duma)); while (read(sd, buf, sizeof(buf)) > 0) printf(buf); exit(0);
if (argc < 3) exit(1); sd = socket(AF_INET, SOCK_STREAM, 0); a.sin_family = AF_INET;
© BME-IIT Sz.I.
© BME-IIT Sz.I.
Socket példa /kliens/ 3
main(int argc, char *argv[]) { int sd; struct sockaddr_in a; struct hostent *hp; char buf[512];
UNIX alapok
<sys/types.h> <sys/socket.h> <stdio.h> <memory.h>
2012.10.10-26.
select(n, &rd_set, &wr_set, &err_set, &timo)
Használatához halmaz kell, ami nincs a C-ben. Segéd függvények: FD_SET(int fd, fd_set *fdset); FD_CLR(int fd, fd_set *fdset); FD_ISSET(int fd, fd_set *fdset); FD_ZERO(fd_set *fdset);
- 47 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 48 -
8
Szerver-kliens m. általánosítása
Szálak
Ötlet: általános daemon (inetd)
• A processzek memóriaterületei egymástól teljesen elkülönítettek. • A szálak olyan processzek, melyeknek csak a stack területe különül el. • Így lényegesen gyorsabban lehet váltani közöttük, valamint könnyebben is kommunikálnak egymással.
• Feleslegesen ne fussanak a daemonok. • A stream socketek teljesen transzparensek a read és write műveletekre, ezért egy szervernek nem is kell tudnia, hogy hálózat felett kommunikál. (szűrők általánosítása) • Könnyen konfigurálható ill. újra konfigurálható. • Szolgáltatási funkciók (portok) kiosztása (services, protocols). UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
– pthread_create(), pthread_join(), pthread_exit() – pthread_mutex_..., pthread_cond_... - 49 -
UNIX alapok
pthread példa
© BME-IIT Sz.I.
2012.10.10-26.
int main(int argc, char* argv[]) { pthread_t thread_a, thread_b; char a = 'a', b = 'b', c = 'c';
printf("Ide nem jut!\n"); return 0; } - 51 -
thread leírója
megvalósító függvény
UNIX alapok
© BME-IIT Sz.I.
egyedi paraméter 2012.10.10-26.
- 52 -
make • Egy szöveges leírás (Makefile), és az állományok módosítási ideje alapján végrehajtja cél (program, dokumntáció stb.) előálításához szükséges parancsokat. • Makefile:
make sccs, rcs, cvs prof lex yacc awk perl .............
UNIX alapok
- 50 -
pthread_create(&thread_a, NULL, do_loop, &a); pthread_create(&thread_b, NULL, do_loop, &b); do_loop(&c);
Fejlesztést segítő eszközök • • • • • • • •
2012.10.10-26.
pthread példa/2
#include <stdio.h> thread-et megvalósító #include függvény void* do_loop(void *id) { int i, j; float f = 0; thread egyedi adata char me = *(char *)id; for (i=0; i<10; i++) { for (j=0; j<5000000; j++) f++; printf("Thread_%c: %d\n", me, i); } pthread_exit(NULL); } return is jó lenne, de ... UNIX alapok
© BME-IIT Sz.I.
– makró definíciók, – függőségi információk (szabályok és implicit szabályok) – végrehajtható parancsok – megjegyzések © BME-IIT Sz.I.
2012.10.10-26.
- 53 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 54 -
9
Makefile szerkezete
make példa
feltételek prog:
Makródefiníció: makró_név = string
x.o y.o z.o cc x.o y.o z.o -o prog
cél x.o:
Szabályok: cél1 [cél2] :[:] [feltétel1...] [;parancsok] [#...] [parancsok][#...]
y.o: z.o:
parancs
x.c x.h cc -c x.c y.c x.h cc -c y.c z.c cc -c z.c
!!!!!! A parancsok előtt van !!!!! UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 55 -
UNIX alapok
make példa/2
© BME-IIT Sz.I.
2012.10.10-26.
Futási idő analízis
OBJECTS = x.o y.o z.o HEADS = x.h prog: $(OBJECTS) $(CC) $(OBJECTS) -o prog $(OBJETS): $(HEADS)
• A profil() rendszerhívás segítségével megmérhető, hogy hol, mennyi időt töltött a program: profil(buf, bufsiz, offset, scale) fixpontos tört
óra IT
.c.o:
program PC
$(CC) -c $<
bufsiz scale
implicit szabály miatt a .o-k egyértelműen előállíthatók. UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 57 -
UNIX alapok
Futási idő analízis/2
© BME-IIT Sz.I.
2012.10.10-26.
© BME-IIT Sz.I.
++ ++ számlálók ++ 2012.10.10-26.
- 58 -
Futási idő analízis/3
• A futás végén a buffer számlálóit kiírva a statisztika feldolgozható (prof, gprof). • Megfelelő starup és exit kódot linkelve ez automatikussá tehető (cc -p, gcc -pg). • A függények prológ kódját módosítva a függvényekbe való belépések száma könnyen mérhető. gcc –pg –o pogram program.c UNIX alapok
- 56 -
Ekkor a program futtatásakor keletkezik egy (g)mon.out, amint a gprof programmal lehet feldolgozni: pl: (g)prof program ... %time cumsecs #call ms/call name 61.5 0.08 1 80.00 _vege 38.5 0.13 500 0.10 _xyz 0.0 0.13 1 0.00 _exit 0.0 0.13 1 0.00 _main 0.0 0.13 1 0.00 _printf 0.0 0.13 1 0.00 _write - 59 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 60 -
10
Verziókezelő rendszerek
Verziókezelő rendszerek/2
• Együtt kezelik különböző verziókat. Nincs szükség számtalan, változatos nevű állományra. • Vannak operációs rendszerek, melyek ehhez támogatást adnak, de.... • Segítik a verziók adminisztrálását (kötelező megjegyzés)
Jellemző életciklus: R.L.b.l
1.1
1.2
– SCCS (admin, get, delta) – RCS (rcs, ci, co) – CVS (init, checkout, add, update, commit, ...) UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 61 -
UNIX alapok
1. 2. 3. 4. 5. 6. 7.
– fájl szemlélet, AT&T implementáció
• RCS – Revision Control System – fáj szemlélet, GNU implementáció
• CVS – Concurrent Versions System – projekt szemlélet, GNU implementáció – hálózatorientált, kliens-szerver felépítés is
• SVN – Subversion
- 63 -
UNIX alapok
© BME-IIT Sz.I.
- 62 -
UNIX alapok
update resolved commit © BME-IIT Sz.I.
2012.10.10-26.
- 64 -
jani: svn checkout http://svn.iit.bme.hu/proga2/nevsor Password for 'jani': A nevsor/adat.h A nevsor/adat.cpp A nevsor/Makefile A nevsor/nevsor.cpp Checked out revision 6.
szebi
2012.10.10-26.
2012.10.10-26.
Hozzunk léte közösen egy programot, ami kiírja a résztvevők nevét. A projekt kezdő változata már svn alá van vonva (1-4 lépések). repository elérése: http://svn.iit.bme.hu/proga2 könyvtár (modul) neve: nevsor Jani is be szeretné írni a listába a nevét:
$Id: szam.y,v 1.3 2005/03/28 21:32:31 szebi Exp $ yacc program demo (binaris - decimalis konverter) $Log: szam.y,v $ Revision 1.3 2005/03/28 21:32:31 szebi Compile: 2005/03/28 20:40:07
1.3.1.2
SVN példa
Célszerű használni kulcsszavakat, így a programunk automatikusan kommentezhető. Pl: $Id$ $Log$
Revision 1.2 Keywords
4.12
install, tár (repository) létrehozása, jogok beállítása szerver indítása (nem feltétlenül kell) projekt állományainak létrehozása import checkout commit ha van konfliktus:
CVS a gyakorlatban/2
* * * * * * * *
© BME-IIT Sz.I.
– – –
– CVS-hez hasonló, talán átgondoltabb, projekt szemlélet, hatékonyabb hálózatkezelés, kliensszerver felépítés 2012.10.10-26.
2.1
CVS ill. SVN a gyakorlatban
• SCCS – Source Code Control System
© BME-IIT Sz.I.
1.3
1.3.1.1
Verziókezelő rendszerek/3
UNIX alapok
1.3.2.2
1.3.2.1
- 65 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 66 -
11
SVN példa/2
SVN példa/3
jani: cd nevsor jani: vi nevsor.cpp jani: svn commit –m "Jani beirva" Sending nevsor.cpp svn: Commit failed (details follow): svn: Your file or directory 'nevsor.cpp' is probably out-of-date ... jani: svn log -r HEAD itt megkapja a legutolsó log üzenetet jani: svn diff -r HEAD:PREV itt megkapja a két verzió közötti eltérést
UNIX alapok
konfliktus feloldása: nevek.push_back(new Adat("Kápolnai Richárd", "K2B", 0)); <<<<<<< .mine nevek.push_back(new Adat("Jani Jani", "K1X", 0)); ======= nevek.push_back(new Adat("Nagy Ákos", "K1D", 0)); >>>>>>> .r7
jani: svn update C nevsor.cpp Updated to revision 7. jani: ls nevsor* nevsor.cpp nevsor.cpp.mine nevsor.cpp.r6 nevsor.cpp.r7 jani: vi nevsor.cpp
© BME-IIT Sz.I.
2012.10.10-26.
jani: svn resolved nevsor.cpp Resolved conflicted state of 'nevsor.cpp' jani: svn commit –m "Jani beirva" Sending nevsor.cpp Transmitting file data . Committed revision 8. - 67 -
UNIX alapok
SVN kulcsszavak
2012.10.10-26.
- 69 -
UNIX alapok
lex: Lexical Analyzer Generator
© BME-IIT Sz.I.
2012.10.10-26.
© BME-IIT Sz.I.
2012.10.10-26.
- 70 -
lex program felépítése definíciós rész %% lex szabályok %% C utasítások
• Lexikai analizátor generátor • Reguláris kifejezésekkel megadott lexikai elemek felismeréséhez C programot generál. • A generált yylex() függvény önállóan is felhasználható (–ll). Ilyenkor a főprogram ciklusban hívja a standard inputra. • Legtöbbször azonban beépítik egy másik programba. UNIX alapok
- 68 -
http://svn.iit.bme.hu/proga2 ill. proga2_user hozzáférés: akinek van ural2 témaszáma jelszó: ural2: ~szebi/bin/svn_passwd svn kliens az ural2-n: ~szebi/bin/svn grafikus svn kliens: http://www.syntevo.com/smartsvn/index.html pluginek: Eclipse, JDeveloper, NetBeans, Visual Studio hasznos linkek: http://subversion.tigris.org http://svnbook.red-bean.com http://svn.iit.bme.hu
/** * Nagy nevsor svn-nel * $Date: 2008-05-03 11:11:22 +0200 (Sat, 03 May 2008) $ */ © BME-IIT Sz.I.
2012.10.10-26.
SVN homokozó az IIT-n
Célszerű használni kulcsszavakat, így a a forrásban automatikusan frissített kommentek helyezhetők el. − Date, LastChangedDate − Revision, LastChangedRevision, Rev − Author, LastChangedBy − HeadURL, URL. − Id Helyettesítésüket engedélyezni kell pl: svn propset svn:keywords "Date"
UNIX alapok
© BME-IIT Sz.I.
A lex szabályok reguláris kifejezésből, és a hozzá tartózó C utasításokból állnak. Minden ami nem a sor elején kezdődik az C utasításként értelmeződik.
%{ ez is C utasításként értelmeződik %} - 71 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 72 -
12
lex példák reguláris kifejezés
lex példák/2 D A %% if {A}+ 0{D}+ {D}+ "++" "+"
tevékenység
%% \n printf("\r\n"); ide olvas be %% [A-Z] [ ]+$ [ ]+
putchar(yytext[0]+'a'-'A'); ; putchar(' ');
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 73 -
[0-9] ([a-z]|[A-Z])
definíciók
printf("IF utasítás\n"); reguláris kifejezés printf("azonosító %s\n", yytext); printf("oktális szám %s\n", yytext); printf("decimális szám %s\n", yytext); printf("++ op\n"); printf("+ op\n");
UNIX alapok
© BME-IIT Sz.I.
yacc program felépítése
yacc: Yet Another Compiler-Compiler
deklarációk %% szabályok %% program
• Compiler generáló eszköz környezetfüggetlen nyelvhez, egészen pontosan LALR(1)-hez. • A nyelvtani szabályokból előállítja a nyelvtant felismerő C programot. • A generált yyparse() függvény önállóan is használható (-ly). • Legtöbbször azonban beépítik másik programba.
A szabályok egy nem terminális szimbólumot írnak le terminális és nemterminális szimbólumokkal. A leíráshoz tevékenység ill. érték is tartozhat.
"és" kapcsolat szjegy | szjegy szám; szjegy: '0' | '1'; szam:
terminális
"vagy" kapcsolat UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 75 -
UNIX alapok
yacc példa (bin.-dec) %% sor: /* | sor | sor | sor
© BME-IIT Sz.I.
ch = getchar(); yylval = ch - '0'; return(ch); }
2012.10.10-26.
- 76 -
/* beolvas */ /* érték */ /* típus */ a lexikai elem típusa
"szam" fogalom értéke © BME-IIT Sz.I.
"
%% int yylex() /* lexikai elemző */ { a lexikai elem értéke extern int yylval; int ch;
{ $$ = $1 * 2 + $2; };
szjegy: '0' | '1';
UNIX alapok
2012.10.10-26.
yacc példa (bin.-dec)/2
tevékenység ures */ '\n' szam '\n' { printf("sz: %d\n", $2); } error '\n'{ yyerrok; }; "szjegy" értéke
szam: szjegy | szam szjegy
- 74 -
2012.10.10-26.
- 77 -
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 78 -
13
yacc-lex példa
romailex.l %{ #include "romai.h" a lexikai elem típusa extern int yylval; %} %% I { yylval= 1; return RDIG; } V { yylval= 5; return RDIG; } X { yylval= 10; return RDIG; } L { yylval= 50; return RDIG; } C { yylval= 100; return RDIG; } D { yylval= 500; return RDIG; } M { yylval=1000; return RDIG; } [^IVXLCDM] { return yytext[0]; }
• Római számokat alakítunk át: • Fel kell ismerni a római számjegyeket – lex
• Ki kell számolni a helyiérték szerinti értéküket – yacc
• A lex és yacc által generált kódot össze kell szerkeszteni. UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 79 -
UNIX alapok
romai.y
© BME-IIT Sz.I.
2012.10.10-26.
- 80 -
romai.y /2
%token RDIG a lexikai elem típusa %{ int last = 0; %} C deklaráció %% list: | list '\n' | list number '\n' { printf("->%d\n",$2); last = 0; } | list error '\n' { yyerrok; } ;
UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 81 -
number: RDIG { last = $$ = $1; } | RDIG number { if ($1 >= last) $$ = $2 + (last = $1); else $$ = $2 - (last = $1); };
UNIX alapok
© BME-IIT Sz.I.
Mi jött ? pl. XI, v. IX ?
2012.10.10-26.
- 82 -
romai fordítása, szerkesztése yacc -b romai -d romai.y mv -f romai.tab.c romai.c mv -f romai.tab.h romai.h gcc -c romai.c -o romai.o
yacc: keletkezik az yyparse() és a header lex: keletkezik az yylex()
lex -t romailex.l >romailex.c gcc -c romailex.c -o romailex.o gcc -o romai romai.o romailex.o –ly -ll A main() a liby-ból jön. A libl-ből pedig az yywrap(). SORREND! (flex, és bison esetén explicit fv. kell!) UNIX alapok
© BME-IIT Sz.I.
2012.10.10-26.
- 83 -
14