ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 1ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 5 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 11
Εξοικείωση µε θεμελιώδεις έννοιες και µηχανισµούς που προσφέρει το λειτουργικό σύστηµα UNIX και τα UNIX-like συστήµατα ◦ δηµιουργία/διαχείριση διεργασιών ◦ επικοινωνία διεργασιών Γλώσσα προγραµµατισµού C Κλήση συστήµατος fork Χρήση Sockets Μοντέλο Πελάτη-Εξυπηρέτη (Client-Server model) Χρήση Shared memory Χρήση Semaphores Χρήση Signals - 2 -
2 ή 3 ασκήσεις Συνολικά 40% του τελικού βαθµού στο μάθηµα Η 1η άσκηση θα αναρτηθεί τις επόµενες ηµέρες - 3 -
Οι ασκήσεις ϑα είναι σε οµάδες των 2-3 ατόµων Παραδίδονται ηλεκτρονικά µέσω της σελίδας του µαθήµατος Η ηµεροµηνία παράδοσης θα ανακοινώνεται µαζί µε την άσκηση Σε περίπτωση που µια άσκηση παραδοθεί µε καθυστέρηση θα υπάρχει µείωση βαθµού - 10% για κάθε µέρα - 4 -
Σε περίπτωση που εντοπιστεί αντιγραφή, ο βαθµός στο µάθηµα θα µηδενιστεί για όλους όσους εµπλέκονται στην αντιγραφή Αν ο κώδικας µιας άσκησης δεν κάνει compile η άσκηση αυτή θα µηδενίζεται Η υλοποίηση κάθε άσκησης θα πρέπει να χρησιµοποιεί τα βασικά εργαλεία που θα παρουσιάζονται στο αντίστοιχο φροντιστήριο - 5 -
Ο κώδικας πρέπει να έχει επαρκή σχόλια Στρατηγικά σχόλια – επεξήγηση σε υψηλό επίπεδο στην αρχή κάθε function ◦ Λάθος παράδειγμα σχόλιου: i=i+1 //Η μεταβλητή i αυξάνεται κατά 1 ◦ Σωστό σχόλιο i=i+1 // Ο αριθμός των διεργασιών που κάνουν αυξάνεται για να. - 6 -
Τακτικά σχόλια – επεξήγηση του πηγαίου κώδικα Επαρκή σχόλια = 60% των συνολικών γραµµών είναι σχόλια (∼ 1-2 γραµµές σχόλια για κάθε 1 γραµµή πηγαίου κώδικα) Μερικά σχόλια = < 60 % των συνολικών γραµµών – -1 βαθµός Καθόλου σχόλια – -2 βαθµοί ∆οµή πηγαίου κώδικα ◦ Σωστή χρήση tabs-spaces ◦ Μη οµοιόµορφη / καθόλου – -1 βαθµός ◦ Σωστή δοµή σε συναρτήσεις / υπο-αρχεία - 7 -
Με την χρήση εικονικών μηχανών Κατέβασμα του virtualbox ◦ Κατέβασμα έτοιμου στημένου συστήματος linux ◦ Ubuntu image από εδώ: ◦ es/Ubuntu%20Linux/12.04/ubuntu_12.04-x86.7z es/Ubuntu%20Linux/12.04/ubuntu_12.04-x86.7z ◦ Username: ubuntu password: reverse Μεταφορά αρχείων από/προς την εικονική μηχανή - 8 -
Απαραίτητο εργαλείο για: ◦ Δημιουργία εκτελέσιμων αρχείων από τον πηγαίο κώδικα Χρήσιμο για: ◦ Περιήγηση στους φακέλους ◦ Συγγραφή πηγαίου κώδικα Στο ubuntu βρίσκεται στο Applications- >Accessories->Terminal Βασικά πλήκτρα: ◦ «κάτω βελάκι», «πάνω βελάκι», «μια φορά πάτημα tab», «δύο γρήγορες φορές πάτημα tab» - 9 -
cd ◦ cd.. (ανέβα ένα επίπεδο πάνω) ◦ cd ~ (πήγαινέ με στο home dir μου) ◦ pwd (που βρίσκομαι) ls mkdir, rmdir, mv, rm, cp man ◦ Οδηγίες για τα πάντα… ◦ Πχ man read, man write, man open
Μπορείτε να χρησιμοποιήσετε GUI ◦ Text editor ◦ Applications->Accessories->Text Editor Μπορείτε να γράφετε σε vi μέσω terminal Και στις δυο περιπτώσεις, σημαντικό είναι το syntax highlighting ◦ Κάνει τον κώδικα πιο ευανάγνωστο
1. Compile (Μεταγλώττιση): file1.c =>file1.o 2. Link: file1.o + file2.o => exec
Το χρησιμοποιούμε για να παράγουμε τα εκτελέσιμα αρχεία από τον πηγαίο κώδικα Βασική εντολή (compile και link): ◦ gcc -Wall helloworld.c -o helloworld ◦ Σημαίνει: «κάνε compile και link το helloworld.c και φτιάξε το εκτελέσιμο helloworld» ◦ Για να «τρέξω» το helloworld γράφω: ◦./helloworld ◦ (μαζί με το./ ) #include<stdio.h> int main(int argc, char **argv) { printf("Hello World\n"); printf("Hello World\n"); return 0; return 0;} helloworld.c
Το χρησιμοποιούμε για να παράγουμε τα εκτελέσιμα αρχεία από τον πηγαίο κώδικα Βασική εντολή (πρώτα compile και μετά link) gcc -Wall -c helloworld.c gcc helloworld.o -o helloworld Το τρέχω πάλι με: ./helloworld #include<stdio.h> int main(int argc, char **argv) { printf("Hello World\n"); printf("Hello World\n"); return 0; return 0;} helloworld.c
#include #include void hello(const char *name) { printf("Hello %s!\n", name); } hello.c void hello(const char *); int main(int argc, char **argv) {hello("World"); return 0; } main.c terminal $ gcc -Wall -c main.c $ gcc -Wall -c hello.c $ gcc main.o hello.o -o hello $./hello Hello World!
Διεπαφή προς άλλα κομμάτια κώδικα (API) Περιέχουν πρότυπα και δηλώσεις ◦ Συναρτήσεις ◦ Καθολικές (global) μεταβλητές .h αρχεία preprocessor: #include "header.h"
void hello(const char *); hello.h #include #include void hello(const char *name) { printf("Hello %s!\n", name); } hello.c #include "hello.h" int main(int argc, char **argv) {hello("World"); return 0; } main.c
int main(int argc, char **argv) ◦ argc: Αριθμός ορισμάτων προγράμματος ◦ argv: Πίνακας με τα ορίσματα ◦ argv[0]: Το όνομα του προγράμματος Παράδειγμα: αρχείο args.c #include #include int main(int argc, char **argv) { int i; for (i=0; i<argc; i++) printf("%d %s\n", i, argv[i]); return 0; } $./args arg1 arg2 0./args 1 arg1 2 arg2 args.c terminal