Εργαστήριο λειτουργικών συστημάτων I

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Βασικά στοιχεία επικοινωνίας με το φλοιό

Καλώς ήρθατε

Εργαστήριο λειτουργικών συστημάτων

Τι περιλαμβάνει το μάθημα

  1. Βασικά στοιχεία επικοινωνίας με το φλοιό
  2. Χρήση και πλοήγηση σε καταλόγους
  3. Εντολές επεξεργασίας αρχείων κειμένου
  4. Εντολές επεξεργασίας ταξινομημένων αρχείων
  5. Ο διορθωτής vi
  6. Δομές προγραμματισμού του φλοιού
  7. Η γλώσσα awk
  8. Ο διορθωτής ροής sed
  9. Προγραμματίζοντας σε perl
  10. H γλώσσα προγραμματισμού C
  11. Κλήσεις του λειτουργικού συστήματος σε C

Οι σημειώσεις

Σύνδεση με τον υπολογιστή

Απλές εντολές

date Τυπώνει τη μέρα και την ώρα
whoami Τυπώνει το όνομά μας
cal Τυπώνει το ημερολογίου του μήνα
echo hello Τυπώνει hello
echo $HOST Τυπώνει την τιμή της μεταβλητής HOST
finger Τυπώνει τους τρέχοντες χρήστες

Παράδειγμα:

University of the Aegean
Dept of Mathematics
Samos - Greece

*** Network Connection on ttyp0
Local Time: 19:00 on Wednesday, 29 October 1997

This is node athena.math.aegean.gr

UNAUTHORIZED ACCESS PROHIBITED

login: dspin
dspin's Password:
Last login: Wed Oct 29 18:29:10 on ttyp0 from kerkis.math.aeg
No mail.
There are no messages in your incoming mailbox.

athena:~> date
Wed Oct 29 19:01:20 EET 1997

athena:~> whoami
dspin

athena:~> echo hello
hello

athena:~> echo $HOST
athena

athena:~> cal
    October 1997
 S  M Tu  W Th  F  S
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

athena:~> finger
Login    Name                 Tty  Idle  Login Time   Office     Office Phone
dspin    Diomidis Spinelis     p0        Oct 29 19:00 [ rls105.math.aeg ]
s95138   Antoniou Niki         p1        Oct 29 18:35 [ pyth ]                                                

Το πρόγραμμα βοηθείας

Παράδειγμα:

athena:~> apropos topological
tsort (1)            - Topological sort of a directed graph

athena:~> man tsort 

TSORT(1)                     UNIX Reference Manual                    TSORT(1)

NAME
     tsort - topological sort of a directed graph

SYNOPSIS
     tsort [file]

DESCRIPTION                                           
...

Αρχεία

touch αρχείο Δημιουργεί ένα κενό αρχείο
ls Τυπώνει τα αρχεία ενός καταλόγου
rm Διαγράφει αρχεία
mv Αλλάζει όνομα σε αρχεία
more Τυπώνει αρχεία σελίδα-σελίδα
cat Ενώνει και τυπώνει αρχεία
grep λέξη [αρχείο] Ψάχνει για τη λέξη στο αρχείο

Παράδειγμα:

athena:~/eg> touch myfile
athena:~/eg> ls
myfile
athena:~/eg> rm myfile
athena:~/eg> ls
athena:~/eg> touch one
athena:~/eg> ls
one
athena:~/eg> mv one two
athena:~/eg> ls
two
athena:~/eg> grep Elen /etc/passwd
s95128:XyiD4md/Jk9.E:690:100:Xatzinikolaou Eleni:/home/stud/c95/s95128:/bin/tcsh
s96027:savucWqVCSLHQ:587:100:Gkougkoulia Eleni:/home/stud/c96/s96027:/bin/tcsh
s96035:Qys4Lwmsy.uLI:599:100:Drimtzia Eleni:/home/stud/c96/s96035:/bin/tcsh
s96050:FokFq/a5cJBgs:626:100:Kontaraki Eleni:/home/stud/c96/s96050:/bin/tcsh
s96052:7T6k.D7lzkyK.:631:100:Kote Maria-Elena:/home/stud/c96/s96052:/bin/tcsh
s96138:GhPFvxg0F7W.g:840:100:Pozoukidou Eleni:/home/stud/c96/s96138:/bin/tcsh  

Αλλαγή εισόδου και εξόδου

Γενική βιβλιογραφία

Ασκήσεις

Άσκηση OSL01

  1. Μετρήστε πόσοι Γιάννηδες έχουν λογαριασμό στο σύστημα. Το αρχείο /etc/passwd περιέχει τα ονόματα όλων των χρηστών του συστήματος.

Χρήση και πλοήγηση σε καταλόγους

Δενδρική δομή

Οι κατάλογοι στο Unix είναι οργανωμένοι με βάση τη δενδρική δομή. Τα παρακάτω στοιχεία έχουν ξεχωριστό νόημα:
/
Η κορυφή του δένδρου - διαχωριστικό μεταξύ καταλόγων
.
Ο κατάλογος στον οποίο βρισκόμαστε
..
Ο κατάλογος πάνω από αυτόν στον οποίο βρισκόμαστε
όνομα
Όνομα αρχείου ή καταλόγου
Παραδείγματα:
foo
Tο αρχείο foo στον κατάλογο που βρισκόμαστε.
bar/foo
Tο αρχείο foo στον κατάλογο bar που βρίσκεται κάτω από τον κατάλογο που βρισκόμαστε.
./foo
Tο αρχείο foo στον κατάλογο που βρισκόμαστε.
././foo
Tο αρχείο foo στον κατάλογο που βρισκόμαστε.
/foo
Tο αρχείο foo στην κορυφή του δένδρου.
/bar/foo
Tο αρχείο foo στον κατάλογο bar που βρίσκεται στην κορυφή του δένδρου.
Ορισμένοι φλοιοί προσφέρουν πρόσθετες συντομογραφίες όπως το σήμα ~ για την αναφορά του προσωπικού μας καταλόγου.

Σε οποιοδήποτε σημείο χρειαστεί να δώσουμε ένα όνομα αρχείου ή καταλόγου μπορούμε να δώσουμε το αντίστοιχο μονοπάτι που να ορίζει το αντίστοιχο αρχείο ή τον κατάλογο.

Εντολές καταλόγων

Η χρήση των καταλόγων γίνεται με τις παρακάτω εντολές:
cd
Μετάβαση σε συγκεκριμένο κατάλογο
mkdir
Δημιουργία ενός νέου καταλόγου
rmdir
Διαγραφή ενός (άδειου) καταλόγου
pwd
Εκτύπωση του μονοπατιού του καταλόγου στον οποίο βρισκόμαστε
Μερικοί φλοιοί και συστήματα Unix προσφέρουν τη δυνατότητα αποθήκευσης σε στοίβα των καταλόγων στους οποίους αλλάζουμε με την εντολή pushd και μετάβαση στον τελευταίο κατάλογο της στοίβας με την εντολή popd.

Παράδειγμα:

athena:~> mkdir eg
athena:~> cd eg
athena:~/eg> pwd
/home2/staff/dspin/eg
athena:~/eg> cd /home2/staff/dspin/eg
athena:~/eg> pwd
/home2/staff/dspin/eg
athena:~/eg> cd ../eg
athena:~/eg> pwd
/home2/staff/dspin/eg
athena:~/eg> cd ..
athena:~> rmdir eg                      

Συνδέσεις

Η σύνδεση των αρχείων σε σχέση με κάποιο όνομα γίνεται με τις παρακάτω εντολές:
ln
Σύνδεση ενός αρχείου σε κάποιο όνομα
ln -s
Συμβολική σύνδεση ενός αρχείου σε κάποιο όνομα
rm
Διαγραφή του ονόματος ενός αρχείου. Οταν διαγραφεί και το τελευταίο όνομα ενός αρχείου τότε διαγράφονται και τα περιεχόμενά του.
mv
Μεταφορά της σύνδεσης ενός αρχείου σε άλλο όνομα

Παράδειγμα:

athena:~> ls -l >foo
athena:~> ln foo bar
athena:~> mv bar bar1
athena:~> rm foo
athena:~> cat bar1
total 248
-rw-r--r--   1 dspin    users        2847 Oct 29 16:11 afm
drwxr-xr-x   2 dspin    users        1024 Feb 26  1997 bin/
-rw-r--r--   1 dspin    users           0 Oct 29 19:10 foo
-rw-------   1 dspin    users       29793 Jun 21 20:57 mbox
-rwxr-xr-x   1 dspin    users         100 Oct 29 17:42 myspell*
-rw-r--r--   1 dspin    users        2023 Oct 29 16:07 names
-rw-r--r--   1 dspin    users        2741 Oct 29 16:11 phones
-rw-r--r--   1 dspin    users        2741 Oct 29 18:45 phones.sorted
-rw-rw-r--   1 dspin    users         995 Mar 12  1997 submit
-rw-r--r--   1 dspin    users      206662 Oct 22 15:08 words                

Συστήματα αρχείων

Το δένδρο των αρχείων του Unix δημιουργήται από τη σύνδεση συστημάτων αρχείων. Οι παρακάτω εντολές επεξεργάζονται συστήματα αρχείων:
df
Εμφάνιση των συνδεδεμένων συστημάτων αρχείων και του χώρου τους.
mount
Σύνδεση ενός συστήματος αρχείων σε έναν κατάλογο
unmount
Αποσύνδεση ενός συστήματος αρχείων σε έναν κατάλογο
Οι δύο τελευταίες εντολές δεν επιτρέπεται συνήθως να εκτελούνται από απλούς χρήστες.

Παράδειγμα:

athena:~> df
Filesystem         1024-blocks  Used Available Capacity Mounted on
/dev/hda1             243497  232125        0    100%   /
/dev/sda1             234961  213177     9651     96%   /home
/dev/hda3             221535  114008    96087     54%   /home3
/dev/hdb1             302030  218400    68032     76%   /home1
/dev/hdb2             197140   81081   105879     43%   /home2
/dev/hdb3             427409  297456   107878     73%   /usr/apps
/dev/hdb4              72211   52270    16212     76%   /tmp
athena:~> mount
/dev/hda1 on / type ext2 (rw)
/dev/sda1 on /home type ext2 (rw,nosuid)
/dev/hda3 on /home3 type ext2 (rw,nosuid)
/dev/hdb1 on /home1 type ext2 (rw,nosuid)
/dev/hdb2 on /home2 type ext2 (rw,nosuid)
/dev/hdb3 on /usr/apps type ext2 (rw,nosuid)
/dev/hdb4 on /tmp type ext2 (rw,nosuid)
none on /proc type proc (rw)                                          

Κατάλογοι του Unix

Σε συστήματα Unix οι παρακάτω κατάλογοι έχουν ξεχωριστή σημασία:
/usr
Αρχεία που σχετίζονται με τη χρήση του συστήματος
/usr/bin
Εκτελέσιμα προγράμματα
/usr/man
Αρχεία βοήθειας
/usr/lib
Βιβλιοθήκες και άλλα αρχεία που χρησιμοποιούνται από προγράμματα
/usr/dict
Λεξικά
/usr/sbin
Εκτελέσιμα προγράμματα υποστήριξης του συστήματος
/tmp
Προσωρινή αποθήκευση
/etc
Αρχεία καθορισμού παραμέτρων του συστήματος
/var
Μεταβαλόμενα αρχεία του συστήματος
/var/spool
Αρχεία που δημιουργούν τα προγράμματα του συστήματος
/var/spool/mail
Γραμματοκιβώτια
/var/spool/news
Usenet News
/dev
Ψευδοαρχεία συσκευών
/proc
Ψευδοαρχεία διαδικασιών

Εντολές επεξεργασίας αρχείων κειμένου

Εντολές επεξεργασίας αρχείων κειμένου

Επεξεργασία αρχείων ή ροών κειμένου μπορεί να γίνει με τις παρακάτω εντολές:
grep
Εύρεση κανονικής έκφρασης
egrep
Εύρεση επαυξημένης κανονικής έκφρασης
fgrep
Εύρεση σταθερών συμβολοσειρών
tr
Μετάφραση χαρακτήρων
fmt
Συμπλήρωση λέξεων σε γραμμές
wc
Μέτρηση λέξεων, γραμμάτων, γραμμών
rev
Αντιστροφή των περιεχομένων κάθε γραμμής
diff
Εκτύπωση της διαφοράς δύο αρχείων

Παράδειγμα:

athena:~> grep Giorg names
Giorgos Tsolakakis
Giorgos Kabourakis
Giorgos Zaimis
Giorgos Margaronis
Limperis Giorgos         

athena:~> tr '[a-z]' '[A-Z]' <names 
HEALTH INSTITUTE
RAFAIL MELAS
MANOLIS GERASIMOU
ARGIRIOS ALEXOPOULOS
ANTONIS ANAGNOSTOU
VAGELIS MELETIOU
KOSTAS TSESMELIS
IOANNIS VERGIS
ATHANASIOS PANOUSOS
NIKOLAS TZANETIS         
...

athena:~> fmt names | head
Health Institute Rafail Melas Manolis Gerasimou Argirios Alexopoulos
Antonis Anagnostou Vagelis Meletiou Kostas Tsesmelis Ioannis Vergis
Athanasios Panousos Nikolas Tzanetis Maria Antoniou Nikos Michail
Ioannis Xouvardas Giorgos Tsolakakis Kostantina Tzoula Yannis Asikoglou
Ioannis Soutos Manolis Pirgiotis Dimitris Karakostas Aristidis Kalafatis
Ioannis Diakostamatis Emmanouil Tjogias Aggelos Vouros Stamatis Skoutas
Aegean Health Institute Dimitrios Rizakis Aristea Mela Alexandros
Stratinakis Vaggelis Xatzikostas Panagiotis Charalampopoulos Efi Vergi
Giorgos Kabourakis Giorgos Zaimis Konstantinos Kotis Antonis Margaros  
...

athena:~> wc names
    111     227    2023 names

athena:~> rev names | head
etutitsnI htlaeH
saleM liafaR
uomisareG silonaM
soluopoxelA soirigrA
uotsonganA sinotnA
uoiteleM silegaV
silemsesT satsoK
sigreV sinnaoI
sosuonaP soisanahtA
sitenazT salokiN                    
...

Κανονικές εκφράσεις

Οι κανονικές εκφράσεις επιτρέπουν τον ορισμό σύνθετων συμβολοσειρών με δηλωτικό τρόπο. Τα παρακάτω σύμβολα έχουν ειδικό νόημα:
^
Αρχή της γραμμής
$
Τέλος της γραμμής
.
Οποιοδήποτε γράμμα
[abc]
Ένα από τα γράμματα a, b, ή c
[a-z]
Ένα από τα γράμματα a μέχρι z
[^abc]
Οποιοδήποτε γράμμα εκτός από τα a, b, και c.
Έκφραση*
Η έκφραση μηδέν ή περισσότερες φορές
Έκφραση+
Η έκφραση μία ή περισσότερες φορές (μόνο με την egrep)
Έκφραση?
Η έκφραση μία ή καμία φορά (μόνο με την egrep)
Έκφραση1|Έκφραση1
Η έκφραση1 ή η έκφραση2 (μόνο με την egrep)
(Έκφραση)
Το περιεχόμενο στην παρένθεση (μόνο με την egrep)
\1 \2 ... \n
To περιεχόμενο της νοστής παρένθεσης (μόνο με την egrep)

Παράδειγμα:

athena:~> grep 'abo' words
...
sabotage
seaboard
taboo
thereabouts
turnabout
vagabond
whereabout
...

athena:~> grep '^abo' words
aboard
abode
abolish
abolition
abominable
abominate
aboriginal                 

athena:~> grep bent words
absorbent
bent
benthic
debenture
incumbent
recumbent

athena:~> grep 'bent$' words
absorbent
bent
incumbent
recumbent                                  

athena:~> grep -v '[AEIOUYaeiouy]' words
...
MD
MN
MPH
Mr
Mrs
Ms
m's
Mt
n
NBC                      
...

athena:~> egrep '(.)(.)(.)\3\2\1' words
braggart
Brenner
collocation
diffident
dissident
glossolalia
grammar
grammarian
installation
staccato
suffuse                         

Εντολές ροής δεδομένων και σωληνώσεων

Οι παρακάτω εντολές μπορούν να χρησιμοποιηθούν για την επεξεργασία τμημάτων αρχείων ή ροών κειμένου:
tee
Διοχέτευση αντιγράφου των δεδομένων μιας σωλήνωσης σε αρχείο
head
Εμφάνιση των αρχικών γραμμών της εισόδου
tail
Εμφάνιση των τελικών γραμμών της εισόδου

Παράδειγμα:

athena:~> ls -l | tee foo
total 251
-rw-r--r--   1 dspin    users        2847 Oct 29 16:11 afm
-rw-r--r--   1 dspin    users         627 Oct 29 19:10 bar1
drwxr-xr-x   2 dspin    users        1024 Feb 26  1997 bin/
-rw-------   1 dspin    users       29793 Jun 21 20:57 mbox
-rwxr-xr-x   1 dspin    users         100 Oct 29 17:42 myspell*
-rw-r--r--   1 dspin    users        2023 Oct 29 16:07 names
-rw-r--r--   1 dspin    users        2741 Oct 29 16:11 phones
-rw-r--r--   1 dspin    users        2741 Oct 29 18:45 phones.sorted
-rw-rw-r--   1 dspin    users         995 Mar 12  1997 submit
-rw-r--r--   1 dspin    users         272 Oct 29 19:44 t.c
-r--r--r--   1 dspin    users         547 Oct 29 19:44 t.c,v
-rw-r--r--   1 dspin    users      206662 Oct 22 15:08 words
athena:~> head -2 foo
total 251
-rw-r--r--   1 dspin    users        2847 Oct 29 16:11 afm
athena:~> tail -2 foo
-r--r--r--   1 dspin    users         547 Oct 29 19:44 t.c,v
-rw-r--r--   1 dspin    users      206662 Oct 22 15:08 words           

Βιβλιογραφία

[Hum88]
Andrew Hume. Grep wars: The strategic search initiative. In Proceedings of the EUUG Spring 88 Conference, pages 237-245. European UNIX User Group, 1988.

Εντολές επεξεργασίας ταξινομημένων αρχείων

Η εντολή ταξινόμησης

Η εντολή sort επιτρέπει την ταξινόμηση ενός αρχείου. Είναι υλοποιημένη για να χειρίζεται με ταχύτητα αρχεία μεγάλου μεγέθους. Επιτρέπει τον ορισμό του πεδίου Ν που θέλουμε να ταξινομήσουμε με την παράμετρο +Ν καθώς και του χαρακτήρα C που διαχωρίζει τα πεδία με την παράμετρο -tC.

Παράδειγμα:

athena:~> sort names | head
Aegean Health Institute
Aggelos Vouros
Alexandros Stratinakis
Antonis Anagnostou
Antonis Arxontoulis
Antonis Margaros
Argirios Alexopoulos
Aristea Mela
Aristidis Kalafatis
Athanasios Panousos

athena:~> sort names +1 | head
Syllogos Agapi
Tambakou Aikaterini
Argirios Alexopoulos
Antonis Anagnostou
Miltos Anagnostou
Maria Antoniou
Nikos Antoniou
Antonis Arxontoulis                           

athena:~> sort -t: +1 phones | head
Miltos Anagnostou:10025
Manolis Kalatzis:10706
Nikolas Tzanetis:10938
John Vidalis:11150
Konstantinos Kotis:11178
Ioannis Soutos:11601
Health Institute:12534
Health Institute:12535
Stamatis Skoutas:12887             

Σχεσιακές εντολές

Η εντολή join επιτρέπει τη σχεσιακή σύνδεση δύο ταξινομημένων αρχείων τα οποία δίδονται ως παράμετροι της εντολής. Με την παράμετρο -j N μπορεί να καθοριστεί το πεδίο N το οποίο αποτελεί κλειδί της σχέσης και την παράμετρο -tC ο χαρακτήρας C που διαχωρίζει τα πεδία.

Παράδειγμα:

athena:~> head -1 phones afm
==> phones <==
Health Institute:12534

==> afm <==
Health Institute:12534081         

athena:~> join -t: -j 1 phones afm | head
Health Institute:12534:12534081
Health Institute:12535:12534081
Rafail Melas:54460:54460443
Manolis Gerasimou:41434:41434613
Argirios Alexopoulos:58397:58397370
Vagelis Meletiou:96171:96171096
Kostas Tsesmelis:69012:69012955
Ioannis Vergis:29257:29257932
Athanasios Panousos:56251:56251538
Nikolas Tzanetis:10938:10938443                  

Η εντολή cut επιτρέπει την επιλογή ορισμένων μόνο πεδίων από ένα αρχείο. Με την παράμετρο -f N μπορεί να καθοριστεί το πεδίο N το οποίο θα επιλεχθεί και την παράμετρο -dC ο χαρακτήρας που διαχωρίζει τα πεδία.

Παράδειγμα:

athena:~> cut -d: -f 2 phones | head
12534
12535
54460
41434
58397
17429
96171
69012
29257
56251                               

Εντολές συσχέτισης

H εντολή uniq αφαιρεί ή επιλέγει επαναλαμβανόμες γραμμές σε ένα ταξινομημένο αρχείο.

Η εντολή comm με παραμέτρους ένα ζεύγος αρχείων εμφανίζει τις γραμμές οι οποίες εμφανίζονται στο ένα, στο άλλο ή και στα δύο αρχεία.

Παράδειγμα:

athena:~> cut -d: -f 1 phones | sort | uniq -d
Health Institute
Stratologiko Grapheio Samou
Vasilis Barekos                            

athena:~> sort phones >phones.sorted
athena:~> cut -d: -f 1 phones | sort | uniq -d | join - phones.sorted
Health Institute Institute:12534
Health Institute Institute:12535
Stratologiko Grapheio Samou Grapheio Samou:58221
Stratologiko Grapheio Samou Grapheio Samou:58222
Stratologiko Grapheio Samou Grapheio Samou:58223
Vasilis Barekos Barekos:61312
Vasilis Barekos Barekos:89584                      

Παράδειγμα

Με τις εντολές που έχουμε εξετάσει μέχρι τώρα και με τη χρήση ενός καταλόγου λέξεων είναι δυνατό να κατασκευάσουμε έναν απλό ελεγκτή ορθογραφίας. Ο ελεγκτής εκτελεί τα παρακάτω βήματα:
  1. Μετατρέπει όλες τα μη γράμματα σε άδειες γραμμές (tr -cs '[^A-Za-z]' '\n')
  2. Μετατρέπει όλα τα γράμματα σε πεζά (tr '[A-Z]' '[a-z]')
  3. Ταξινομεί το αποτέλεσμα (sort)
  4. Αφαιρεί τις κοινές λέξεις (uniq)
  5. Επιλέγει τις λέξεις που δεν εμφανίζονται στο λεξικό (comm -23 words)
Παράδειγμα

athena$ man ls |
tr -cs '[^A-Za-z]' '\n' |
tr '[A-Z]' '[a-z]' |
sort |
uniq |
comm -23 - words |
head

[path
abbreviation
abcdfgiklmnopqrstuxabcfglnqrsux
ables
according
affects
after                                         

Ο διορθωτής vi και απλός προγραμματισμός στο φλοιό

Σύντομη λίστα εντολών του διορθωτή vi

Προσοχή όταν δίνετε μία εντολή έχει σημασία αν τα γράμματα είναι κεφαλαία ή μικρά.

Ανοίγοντας ένα αρχείο:
vi όνομα

Μετακίνηση μέσα στο αρχείο:
h (ή το αριστερό βελάκι) Μία θέση αριστερά
l (ή το δεξί βελάκι) Μία θέση δεξιά
k (ή το πάνω βελάκι) Μία γραμμή πάνω
j (ή το κάτω βελάκι) Μία γραμμή κάτω
w Στην επόμενη λέξη

Εισαγωγή και διαγραφή κειμένου:
Ο vi έχει δύο καταστάσεις, κατάσταση εντολών και κατάσταση εισαγωγής κειμένου.

Για να μπείτε στην κατάσταση εισαγωγής κειμένου δίνετε:
i Για να μπείτε στην κατάσταση εισαγωγής κειμένου χωρίς να μετακινηθεί ο δρομέας.
a Για να μπείτε στην κατάσταση εισαγωγής κειμένου μετακινούμενοι μία θέση δεξιά.
I Για να μπείτε στην κατάσταση εισαγωγής στην αρχή της γραμμής
A Για να μπείτε στην κατάσταση εισαγωγής στο τέλος της γραμμής

Για να μπείτε στην κατάσταση εντολών δίνετε:
ESC ή ctrl-[

Για να κάνετε αλλαγές στο κείμενό σας:
x διαγράφει τον χαρακτήρα όπου είναι ο δρομέας
dd διαγράφει την γραμμή που είναι ο δρομέας
u ακυρώνει την τελευταία αλλαγή

Αναζήτηση χαρακτήρων/λέξεων μέσα στο κείμενο:
/χαρακτήρες Βρίσκει την επόμενη γραμμή όπου εμφανίζεται το "χαρακτήρες".
?χαρακτήρες Βρίσκει την προηγούμενη γραμμή όπου εμφανίζεται το "χαρακτήρες".
n Επαναλαμβάνει την αναζήτηση στις επόμενες γραμμές.

Σώζοντας και βγαίνοντας από ένα αρχείο:
:w Σώζει τις τελευταίες αλλαγές και παραμένει μέσα στο αρχείο.
:x Σώζει τις τελευταίες αλλαγές και βγαίνει από το αρχείο
:q! Βγαίνει από το αρχείο χωρίς να σώσει τις αλλαγές

Βασισμένο σε κείμενο του Αντώνη Δανάλη <danalis@edu.physics.uch.gr (http://www.edu.physics.uch.gr/~danalis/index3.html)>

Ο διορθωτής vi: εντολές ανά κατηγορία

Η εντολές που ακολουθούν είναι χωρισμένες σε κατηγορίες ανάλογα με τη λειτουργία που κάνουν.

Εντολές που σβήνουν ή αντιγράφουν κομμάτια του κειμένου

" Ορίζει ένα ενταμιευτή ο οποίος μπορεί να χρησιμοποιηθεί από όλες τις εντολές που χρησιμοποιούν ενταμιευτές. Αν το " ακολουθείται από ένα γράμμα ή ένα νούμερο τότε αυτό είναι το όνομα του ενταμιευτή.
D Σβήνει από εκεί που βρίσκεται ο δρομέας μέχρι το τέλος της γραμμής
p Αντιγράφει τον ενταμιευτή που του ορίζουμε μετά την θέση ή την γραμμή που βρίσκεται ο δρομέας. Αν δεν ορίσουμε κάποιον συγκεκριμένο ενταμιευτή τότε η εντολή p χρησιμοποιεί τον γενικό.(Δείτε το παράδειγμα της εντολής ")
P Αντιγράφει τον ενταμιευτή που του ορίζουμε πριν την θέση ή την γραμμή που βρίσκεται ο δρομέας. Αν δεν ορίσουμε κάποιον συγκεκριμένο ενταμιευτή τότε η εντολή P χρησιμοποιεί τον γενικό.(Δείτε το παράδειγμα της εντολής ")
x Σβήνει τον χαρακτήρα πάνω στον οποίο βρίσκεται ο δρομέας. Αν πριν το x δώσουμε ένα αριθμό τότε θα σβηστούν τόσοι χαρακτήρες μετά το δρομέα.
X Σβήνει τον χαρακτήρα που βρίσκεται πριν το δρομέα.
d Σβήνει μέχρι εκεί που του ορίζουμε.Αν δώσουμε dd σβήνει όλη την γραμμή. Ό,τι σβήνεται τοποθετείται στον ενταμιευτή που του ορίζουμε με την εντολή " , αν δεν ορισθεί ενταμιευτής τότε χρησιμοποιείται ο γενικός.
Y Καταχωρεί την γραμμή στον ενταμιευτή που ορίζουμε, αν δεν ορίσουμε ενταμιευτή χρησιμοποιεί τον γενικό.
y Καταχωρεί στον ενταμιευτή που του ορίζουμε (ή στον γενικό) το κομμάτι του κειμένου που του ορίζουμε. Οι κανόνες που ακολουθεί είναι αυτοί που ακολουθεί και η d εκτός από την καταχώρηση μίας γραμμής που γίνεται δίνοντας
yy

Εντολές εισαγωγής κειμένου

A Ξεκινάει την εισαγωγή του κειμένου από το τέλος της γραμμής
I Ξεκινάει την εισαγωγή του κειμένου από την αρχή της γραμμής
o Ξεκινάει την εισαγωγή του κειμένου στην από κάτω γραμμή από αυτή που βρίσκεται ο δρομέας.
O Το κεφαλαίο γράμμα Ο ξεκινάει την εισαγωγή του κειμένου στην από πάνω γραμμή από αυτή που βρίσκεται ο δρομέας.
a Ξεκινάει την εισαγωγή κειμένου μία θέση μετά από εκεί που βρίσκεται ο δρομέας. Συνδυάζοντας την εντολή a με έναν αριθμό n πετυχαίνουμε εισαγωγή κειμένου n φορές.
i Ξεκινάει την εισαγωγή κειμένου μία θέση πριν από εκεί που βρίσκεται ο δρομέας. Συνδυάζοντας την εντολή i με έναν αριθμό n πετυχαίνουμε εισαγωγή κειμένου n φορές.

Μετακίνηση του δρομέα μέσα σε ένα αρχείο

^B Πάει πίσω μία σελίδα. Μαζί με ένα νούμερο n γυρνάει n σελίδες πίσω.
^F Πάει μπροστά μία σελίδα. Μαζί με ένα νούμερο n πάει n σελίδες μπροστά.
^D Πάει μπροστά μισό παράθυρο. Μαζί με ένα νούμερο n πάει n παράθυρα μπροστά
^H Μετακινεί το δρομέα μία θέση αριστερά. Μαζί με ένα νούμερο n πάει n θέσεις δεξιά
^J Μετακινεί το δρομέα μία γραμμή κάτω στην ίδια γραμμή. Μαζί με ένα νούμερο n πάει n γραμμές κάτω.
^M Πηγαίνει στον πρώτο χαρακτήρα της επόμενης γραμμής.
^N Ό,τι και το ^J
^P Μετακινεί το δρομέα μία γραμμή κάτω στην ίδια γραμμή. Μαζί με ένα νούμερο n πάει n γραμμές κάτω.
^U Πάει πίσω μισό παράθυρο. Μαζί με ένα νούμερο n πάει n παράθυρα πίσω
$ Μετακινεί το δρομέα στο τέλος της γραμμής. Μαζί με ένα νούμερο n πάει στο τέλος της γραμμής που είναι n γραμμές κάτω από το δρομέα.
% Αν ο δρομέας είναι πάνω σε παρένθεση ή αγκύλη τότε τον μετακινεί σε αυτήν που της ταιριάζει
( Μετακινεί το δρομέα στην αρχή της περιόδου
) Μετακινεί το δρομέα στην αρχή της επόμενης περιόδου
{ Μετακινεί το δρομέα στην αρχή της παραγράφου
} Μετακινεί το δρομέα στην επόμενη παράγραφο
| n| Μετακινει το δρομέα στην στήλη n
+ Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα της επόμενης γραμμής
- Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα της προηγούμενης γραμμής
^ Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα της γραμμής
_ Ό,τι και το ^
0 Ο χαρακτήρας μηδέν μετακινεί το δρομέα στην πρώτη στήλη της γραμμής
B Μετακινεί το δρομέα μία λέξη πίσω
E Μετακινεί το δρομέα μία λέξη μπροστά
nG Μετακινεί το δρομέα στην γραμμή n. Αν δε δώσετε n, τότε πάει στο τέλος του κειμένου.
H Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα στην κορυφή της οθόνης
L Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα στο κάτω μέρος της οθόνης
M Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα στο κέντρο της οθόνης
W Μετακινεί το δρομέα μία λέξη πίσω
b Μετακινεί το δρομέα μία λέξη πίσω. Αν ο δρομέας είναι μέσα σε λέξη τότε τον πάει στο πρώτο της γράμμα
e Μετακινεί το δρομέα μία λέξη μπροστά. Αν ο δρομέας είναι μέσα σε λέξη τότε τον πάει στο τελευταίο της γράμμα
w Ό,τι και το e
h Μετακινεί το δρομέα μία θέση αριστερά
j Μετακινεί το δρομέα μία γραμμή κάτω
k Μετακινεί το δρομέα μία γραμμή πάνω
l Μετακινεί το δρομέα μία θέση δεξιά

Μετακίνηση του δρομέα στην οθόνη

n^E Μετακινεί την οθόνη n γραμμές πάνω, χωρίς να την μετακινεί μία γραμμή.
n^Y Μετακινεί την οθόνη n γραμμές κάτω, χωρίς να την μετακινεί μία γραμμή.
z Αλλάζει την οθόνη ως εξής: z τοποθετεί την γραμμή στην κορυφή της οθόνης. z. τοποθετεί την γραμμή στο κέντρο της οθόνης. z- τοποθετεί την γραμμή στο κάτω μέρος της οθόνης. Αν πριν το z υπάρχει ένα νούμερο n, τότε κάνει αυτές τις αλλαγές για την γραμμή n. Για παράδειγμα 16z τοποθετεί στην κορυφή της οθόνης την γραμμή 16

Αντικατάσταση κειμένου

C Αλλάζει την γραμμή από την θέση του δρομέα μέχρι το τέλος της
R Αλλάζει τόσους χαρακτήρες όσους δίνουμε και αφήνει άθικτους τους υπόλοιπους
S Αλλάζει ολόκληρη την γραμμή
c Αλλάζει την γραμμή μέχρι να βρει μία τελεία. Το cc αλλάζει ολόκληρη την γραμμή
r Αλλάζει τον χαρακτήρα που βρίσκεται ο δρομέας
s Αλλάζει τον χαρακτηρα που είναι ο δρομέας και μπαίνει σε insert mode. Με έναν αριθμό n αλλάζει n χαρακτήρες. Ο τελευταίος χαρακτήρας που είναι να αλλάξει αντικαθίσταται προσωρινά με ένα $

Εντολές για να ψάχνετε μέσα σε ένα κείμενο

/ Ψάχνει προς τα κάτω το κείμενο για τη συμβολοσειρά (κανονική έκφραση) που ορίζουμε μετά το /
? Ψάχνει προς τα επάνω το κείμενο για τη συμβολοσειρά (κανονική έκφραση) που ορίζουμε μετά το ?
n Επαναλαμβάνει την τελευταία εντολή / ή ?
N Ό,τι και το n αλλά στην αντίθετη κατεύθυνση
f Ψάχνει μέσα στην γραμμή για τον χαρακτήρα που δίνουμε μετά το f και μετακινεί το δρομέα εκεί.
F Ψάχνει προς τα πίσω μέσα στην γραμμή για τον χαρακτήρα που δίνουμε μετά το f και μετακινεί το δρομέα εκεί.
T Ό,τι και το T αλλά πάει το δρομέα στην επόμενη θέση από τον χαρακτήρα.
t Ό,τι και το f αλλά πάει το δρομέα στην προηγούμενη θέση από τον χαρακτήρα
; Επαναλαμβάνει την τελευταία εντολή f ή F ή t ή T
, Επαναλαμβάνει την τελευταία εντολή f ή F ή t ή T αλλά στην αντίθετη κατεύθυνση

Εντολές μορφοποίησης χαρακτήρων και γραμμών

~ Αλλάζει από κεφαλαίο σε μικρό και από μικρό σε κεφαλαίο το γράμμα που είναι ο δρομέας
<< Μετακινεί την γραμμή προς τα αριστερά. Η τιμή του είναι μεταβλητή και μπορεί να ορισθεί από την set shiftwidth
>> Μετακινεί την γραμμή προς τα δεξιά. Η τιμή του είναι μεταβλητή και μπορεί να ορισθεί από την set shiftwidth
J Ενώνει την γραμμή που βρίσκεται ο δρομέας με την επόμενη. Με ένα νούμερο n μπροστά ενώνει n γραμμές

Εντολές για να σώσετε και να βγείτε από ένα αρχείο

^\ Μπαίνει σε ΕΧ mode. Ο EX editor είναι αυτός πάνω στον οποίο "χτίστηκε" ο VI. Για να επιστρέψετε σε vi mode δίνετε :vi
Q Ό,τι και η ^\
ZZ Βγαίνει από το αρχείο σώζοντας τις αλλαγές

Μερικές ακόμα εντολές

^G Δείχνει το όνομα του αρχείου τον συνολικό αριθμό γραμμών που έχει και τον αριθμό της γραμμής που βρίσκεται ο δρομέας
^L Καθαρίζει την οθόνη.
^R Ξανασχεδιάζει την οθόνη και διορθώνει τα λάθη
^[ Το σύμβολο <ctrl>-[ είναι ουσιαστικά το <ESC>
! Η εντολή ! ξεκινάει ένα shell. Αμα ορίσετε κάποιες συγκεκριμένες γραμμές τότε χρησιμοποιεί αυτές σαν input και τις αντικαθιστά με το output. Η !! χρησιμοποιεί σαν input την γραμμή που είναι ο δρομέας.
& Επαναλαμβάνει την τελευταία εντολή αλλαγής :s
. Επαναλαμβάνει την τελευταία εντολή
: Δίνει την δυνατότητα να εκτελεστεί μια εντολή του ex.
U Φέρνει την γραμμή που είναι ο δρομέας στην γραμμή που ήταν πριν την αλλάξετε
m "Σημαδεύει" την θέση με τον χαρακτήρα που ακολουθεί το m
u Ακυρώνει την τελευταία αλλαγή. Δύο συνεχόμενα u αφήνουν το αρχείο όπως ήταν πριν από αυτά

Εντολές του EX

Ο vi editor είναι βασισμένος πάνω σε έναν διορθωτή γραμμών, τον ex. Ετσι ο vi δίνει την δυνατότητα να εκτελεστούν οι εντολές του ex.
:ab string strings Κάνει συντομογραφία μιας συμβολοσειράς σε μια άλλη. Ετσι αν δώσετε:
:ab usa United States of America
τότε κάθε φορά που θα γράφετε usa θα εμφανίζεται το
United States of America
:map keys new_seq Με την μέθοδο του mapping μπορείτε να κάνετε συντομογραφίες σε εντολες.
:q Βγαίνει από το αρχείο. Αν έχετε κάνει αλλαγές που δεν έχετε σώσει τότε εμφανίζεται ένα μήνυμα και δεν βγαίνει από το αρχείο
:q! Βγαίνει από το αρχείο χωρίς να σώσει τις τελευταίες αλλαγές
:s/from/to/options Αντικαθιστά την λέξη from στην λέξη to.
:set [all] Ορίζει της μεταβλητές του vi. Η εντολή set all δείχνει όλες τις μεταβλητές και για όσες υπάρχει, την τιμή τους.
:una string κάνει το ανάποδο από την ab, δηλαδή αφαιρεί από μια συμβολοσειρά την ιδιότητά του να είναι συντομογραφία κάποιας άλλης.
:unm keys Το αντίστοιχο του una αλλά για την εντολή map
:vi filename Ξεκινάει την επεξεργασία ενός άλλου αρχείου.
:w Σώζει το αρχείο και παραμένει μέσα σε αυτό
:w new_file Σώζει τα περιεχόμενα του αρχείου σε ένα άλλο με όνομα new_file
:w >> filename Προσθέτει το αρχείο, κάτω από το αρχείο filename
:wq Σώζει τις τελευταίές αλλαγές και βγαίνει από το αρχείο
:x Ότι και το x

Βασισμένο σε κείμενο του Αντώνη Δανάλη <danalis@edu.physics.uch.gr (http://www.edu.physics.uch.gr/~danalis/index3.html)>

Προγραμματισμός στο φλοιό

Δομές προγραμματισμού του φλοιού

Σύνθεση εντολών

Ο φλοιός δέχεται:
Απλές εντολές
Εκχώρηση σε μεταβλητή ή εντολή με παραμέτρους, και αλλαγή εισόδου εξόδου τερματισμένη με τον τελεστή ελέγχου &.

Παράδειγμα:

NAME=john
ls -rtl
cat foo bar >foobar
calc_pi &
Σωληνώσεις απλών εντολών
Εντολή (προαιρετικά με ! στην αρχή της) προαιρετικά σωληνωμένη με άλλες εντολές.

Παράδειγμα:

ls -l | more
! grep check file
Λίστες σωληνώσεων
Σωληνώσεις χωρισμένες με:
||
διάζευξη (η δεύτερη εντολή εκτελείται μόνο αν η πρώτη τερματίσει με αποτυχία)
&&
σύζευξη (η δεύτερη εντολή εκτελείται μόνο αν η πρώτη τερματίσει με επιτυχία)
;
παράθεση (η δεύτερη εντολή εκτελείται πάντα μετά την πρώτη)

Παράδειγμα:

mail john <foo && rm foo
cat foo >bar || echo "Unable to read foo"
ls /tmp ; ls /dev
Λίστες σωληνώσεων ομαδοποιημένες σε ( ) ή σε { ; }
Οι παρενθέσεις δηλώνουν εκτέλεση σε υποφλοιό (όλες οι μεταβλητές που ορίζονται στον υποφλοιό δε μεταφέρονται στον τρέχοντα φλοιό), ενώ οι αγκύλες δηλώνουν απλά ομαδοποιημένη εκτέλεση.

Εντολές ελέγχου

Ο φλοιός δέχεται ακόμα τις παρακάτω δομές ελέγχου:
for name [ in word; ] do list ; done
Εκτέλεση των εντολών της list για όλες τις λέξεις θέτοντας κάθε φορά τη μεταβλητή name στην ανάλογη τιμή.

Παράδειγμα:

for fname in *.c
do
	ls -l $fname
	cat $fname
done
case word in [ pattern [ | pattern ] ... ) list ;; ] ... esac
Εκτέλεση των εντολών της list για κάθε word που ταιριάζει με το αντίστοιχο pattern.

Παράδειγμα:

case $fname in
	*.c|*.for)	echo Source file ; cat *.c ;;
	*.o)		echo Object file ;;
	*)		echo Other file ;;
esac
if list_c1 then list_r1 [ elif list_c2 then list_r2 ] ... [ else list_r3 ] fi
Εκτέλεση των εντολών της list_r1 αν η εντολή list_c1 είναι αληθής, αλλιώς εκτέλεση της εντολής list_r2 αν η εντολή list_c2 είναι αληθής ... αλλιώς εκτέλεση της εντολής list_r3.

Παράδειγμα:

if grep John /etc/passwd
then
	echo John is a valid user
else
	echo No user named John was found
fi
while list1 do list2 done
Εκτέλεση των εντολών της list2 όσο είναι επιτυχής η εκτέλεση της εντολής list1

Παράδειγμα:

while ! {finger | grep John ; }
do
	sleep 10
done
echo John  left

Λεκτικά στοιχεία

Μεταβλητές

Οι παρακάτω μεταβλητές έχουν ειδικό νόημα στον φλοιό
$?
Το αποτέλεσμα της προηγούμενης εντολής (αληθές / ψευδές).
$1
Η πρώτη παράμετρος της εντολής
$2
Η δεύτερη παράμετρος της εντολής
Η παράμετρος ν της εντολής
$*
Όλες οι παράμετροι της εντολής

Άσκηση

  1. Υλοποιήστε τη δική σας εντολή, myrm, η οποία για κάθε παράμετρο που της δίδεται για να διαγράψει σας ρωτάει αν θέλετε να διαγράψετε το συγκεκριμένο αρχείο ή όχι.

    Παράδειγμα:

    myrm *.c
    Delete prog1.c (y/n)?
    y
    prog1.c deleted
    Delete prog2.c (y/n)?
    n
    Did not delete prog2.c
    

Βιβλιογραφία

Η γλώσσα awk

Βασική χρήση

Μεταβλητές και τελεστές

Δομές ελέγχου

Η awk υποστηρίζει τις παρακάτω δομές ελέγχου:
if (έκφραση) εντολή1 else εντολή2
Εκτέλεση της εντολής1 αν η έκφραση είναι αληθής (όχι 0). Το τμήμα else μπορεί να παραληφθεί.
while (έκφραση) εντολή
Εκτέλεση της εντολής όσο η έκφραση είναι αληθής.
do εντολή while (έκφραση)
Εκτέλεση της εντολής μέχρι η έκφραση να μην είναι αληθής (έλεγχος στο τέλος του βρόχου).
for (εντολή1; έκφραση; εντολή2) εντολή3
Εκτέλεση της εντολής1 και στη συνέχεια εκτέλεση της εντολής3 και της εντολής2 όσο η έκφραση είναι αληθής. Για παράδειγμα το
FOR I :=0 TO 9 
	WRITELN(i)
της Pascal γράφεται σε awk ως
for (i = 0; i < 10; i++)
	print i
Σε όλες τις περιπτώσεις μια εντολή μπορεί να αντικατασταθεί από περισσότερες με την χρήση των { }.

Άσκηση

Βιβλιογραφία

Στοιχεία της γλώσσας προγραμματισμού C

Δομή

Η C είναι μια γλώσσα προγραμματισμού γενικού σκοπού που προσφέρει οικονομία στην έκφραση, μοντέρνο έλεγχο της ροής του προγράμματος, πλήρεις δομές δεδομένων καθώς και ένα πλούσιο σύνολο τελεστών. Η απουσία περιορισμών και η γενικότητά της την κάνουν ιδιαίτερα εύχρηστη και αποτελεσματική για την υλοποίηση μεγάλου εύρους εφαρμογών.

Τα προγράμματα της C αποτελούνται από ένα σύνολο ορισμών συναρτήσεων και μεταβλητών. Η εκτέλεση του προγράμματος αρχίζει πάντα από τη συνάρτηση main η οποία πρέπει να έχει οποσδήποτε οριστεί. Το παρακάτω είναι ένα απλό πρόγραμμα σε C:

/* Τύπωσε hello, world */
#include <stdio.h>

int
main()
{
	printf("hello, world\n");
	return (0);
}

Οι συναρτήσεις ορίζονται με βάση το όνομά τους, τον τύπο του αποτελέσματος που επιστρέφουν και τα ονόματα και τους τύπους των ορισμάτων τους. Η τιμή που θα επιστρέψει η συνάρτηση δίδεται ως παράμετρος στην εντολή return. Η παρακάτω συνάρτηση επιστρέφει το τετράγωνο ενός ακεραίου:

int
sqr(int n)
{
	return (n * n);
}

Ο προεπεξεργαστής

Το πρόγραμμα της C πριν το μεταγλωτιστή περνά από τον προεπεξεργαστή ο οποίο και εκτελεί ορισμένες απλές λεκτικές αλλαγές. Συγκεκριμένα επιτρέπει:

Βασικοί τύποι

Οι βασικοί τύποι της C είναι:
int
Ακέραιοι
char
Χαρακτήρες
double
Αριθμοί κινητής υποδιαστολής
Οι λογικές τιμές αληθές και ψευδές παριστάνονται με ακέραιους διάφορους του 0 και το 0 αντίστοιχα.

Τελεστές

Δομές ελέγχου

Η C υποστηρίζει τις παρακάτω δομές ελέγχου:
if (έκφραση) εντολή1 else εντολή2
Εκτέλεση της εντολής1 αν η έκφραση είναι αληθής (όχι 0). Το τμήμα else μπορεί να παραληφθεί.
while (έκφραση) εντολή
Εκτέλεση της εντολής όσο η έκφραση είναι αληθής.
do εντολή while (έκφραση)
Εκτέλεση της εντολής μέχρι η έκφραση να μην είναι αληθής (έλεγχος στο τέλος του βρόχου).
for (εντολή1; έκφραση; εντολή2) εντολή3
Εκτέλεση της εντολής1 και στη συνέχεια εκτέλεση της εντολής3 και της εντολής2 όσο η έκφραση είναι αληθής. Για παράδειγμα το
FOR I :=0 TO 9 
	WRITELN(i)
της Pascal γράφεται σε C ως
for (i = 0; i < 10; i++)
	printf("%d\n", i);
switch (έκφραση) {
case σταθερά1: 
	εντολή1; 
	break;
case σταθερά2: 
	εντολή2; 
	break; 
default:
	εντολήΝ;
	break;
}
Εκτέλεση της εντολής της οποίας η σταθερά ταιριάζει με την τιμή της έκφρασης. Αν η τιμή δεν ταιριάζει με καμία σταθερά τότε εκτελείται η εντολή της default.
break;
Τερματισμός της εκτέλεσης του εσώτερου while, do, ή for.
continue;
Επανεκτέλεση του εσώτερου while, do, ή for από την αρχή του βρόχου.
Σε όλες τις περιπτώσεις μια εντολή μπορεί να αντικατασταθεί από περισσότερες με την χρήση των { }.

Άσκηση

Βιβλιογραφία

Κλήσεις του λειτουργικού συστήματος Unix σε C

Παράμετροι της διεργασίας

Οι διεργασίες λαμβάνουν τις παραμέτρους τις οποίες έδωσε ο χρήστης στον φλοιό στον πίνακα argv και τον αριθμό των παραμέτρων στη μεταβλητή argc. Αυτές ορίζονται στην C ως ορίσματα της διαδικασίας main με τον παρακάτω τρόπο:
main(int argc, char *argv[])
{
	...
}
Το πρώτο στοιχείο του πίνακα argv, το argv[0], περιέχει πάντα το όνομα της διεργασίας. Τα επόμενα στοιχεία περιέχουν τις αντίστοιχες παραμέτρους. Για παράδειγμα αν ο χρήστης εκτελέσει την εντολή rm foo οι μεταβλητές argc, argv θα έχουν τις παρακάτω τιμές:
argc: 2
argv[0]: "rm"
argv[1]: "foo"

Άσκηση

Με βάση τα παραπάνω γράψτε το πρόγραμμα myecho το οποίο εκτυπώνει τις παραμέτρους που του δώσατε.
Παράδειγμα
kerkis:~$ myecho hello world
hello world          
kerkis:~$ 

Η κλήση mkdir

Η κλήση του λειτουργικού συστήματος mkdir δημιουργεί έναν νέο κατάλογο. Έχει ως όρισμα το όνομα του νέου καταλόγου και τις άδειες πρόσβασης με τις οποίες πρέπει να δημιουργηθεί.

Άσκηση

Με βάση τα παραπάνω γράψτε το πρόγραμμα mymkdir το οποίο δημιουργεί έναν νέο υποκατάλογο. Ως άδεια στη συνάρτηση mkdir δώστε τον αριθμό 0777.
Παράδειγμα
kerkis:~$ mymkdir foo
kerkis:~$ ls -l
...
drwxr-xr-x   2 dspin    users        1024 Oct 21 12:05 foo/             
...
kerkis:~$ 

Οι κλήσεις πρόσβασης σε αρχεία

Άσκηση

Με βάση τα παραπάνω γράψτε το πρόγραμμα mycat το οποίο εκτυπώνει το περιεχόμενο των αρχείων που του δίδονται ως παράμετροι. Για ευκολία στην αρχή υλοποιήστε το mycat για ένα μόνο αρχείο με μέγεθος μικρότερο από 1024 byte.
Παράδειγμα
kerkis:~$ mycat /etc/motd
Linux 2.0.30.
kerkis:~$           

Βιβλιογραφία

Διεργασίες και διαδιεργασιακή επικοινωνία

Η κλήση fork

Η κλήση fork() διασπά την τρέχουσα διεργασία σε δύο: το γονέα, και το παιδί. Και οι δύο διεργασίες αποτελούνται από τον ίδιο κώδικα, τα ίδια δεδομένα, και βρίσκονται στο ίδιο στάδιο της εκτέλεσής τους. Το παιδί κληρονομεί από το γονέα διάφορα στοιχεία όπως τους περιγραφείς των ανοικτών αρχείων, και το περιβάλλον εκτέλεσης. Ο διαχωρισμός του γονέα από το παιδί γίνεται με βάση την τιμή που επιστρέφει η fork: σε περίπτωση επιτυχίας, στο γονέα επιστρέφει τον κωδικό της διεργασίας του παιδιού, ενώ στο παιδί επιστρέφει 0. (Το παιδί μπορεί να βρει τον κωδικό της διεργασίας του γονέα με την κλήση getppid() (get parent process id)). Τυπικά η κλήση της fork() γίνεται με βάση το παρακάτω μοντέλο:
	int pid;

	pid = fork();
	if (pid == 0) {
		/* I am the child process */
		...
	} else {
		/* I am the parent process */
		...
	}

Παράδειγμα

Υλοποιήστε δύο διεργασίες που εκτελούνται παράλληλα τυπώνοντας διαφορετικά στοιχεία (π.χ. αυξανόμενους αριθμούς). Παρατηρήστε το αποτέλεσμα του χρονοπρογραμματισμού στην αλλαγή της διεργασίας που εκτελείται. (Επιτρέψτε σε κάθε διεργασία να τυπώσει τουλάχιστον 10000 γραμμές).

Η οικογένεια κλήσεων exec

Η οικογένεια κλήσεων exec() αντικαθιστά τη διεργασία που εκτελείται με μια νέα διεργασία που βασίζεται στο πρόγραμμα που δίδεται σαν παράμετρος στην exec. Ένα απλό μέλος της οικογένειας, η execlp(), λαμβάνει ως παραμέτρους, το όνομα ή το μονοπάτι της εντολής, τη μηδενική παράμετρο του πίνακα argv της εντολής (τυπικά, πάλι το όνομά της) και, τις υπόλοιπες παραμέτρους της εντολής τερματισμένες με 0. Αν ως πρώτη παράμετρος δε δοθεί μονοπάτι, τότε η εντολή εντοπίζεται με βάση μονοπάτι των εντολών που έχει καθορίσει ο χρήστης στη μεταβλητή PATH. Το παρακάτω παράδειγμα εκτελεί την εντολή ls -la:
	execlp("/bin/ls", "ls", "-la", 0);
Για να μπορέσει να συνεχίσει η εκτέλεση της αρχικής διεργασίας η exec() συνδιάζεται συχνά με τη fork(). Στοιχεία όπως σωληνώσεις και αλλαγή της εισόδου και εξόδου δεν μπορούν να προσδιοριστούν στην exec μια και αυτά τα χειρίζεται ο φλοιός και όχι ο πυρήνας.

Παράδειγμα

Υλοποιήστε μια διεργασία η οποία ξεκινά ένα παιδί το οποίο εκτελεί την εντολή ls.

Διαδιεργασιακή επικοινωνία με σωληνώσεις

Η κλήση pipe() λαμβάνει ως παράμετρο έναν πίνακα fd δύο ακεραίων και θέτει τις τιμές τους σε περιγραφείς δύο άκρων μιας σωλήνωσης. Ο περιγραφέας fd[0] προσδιορίζει το άκρο της σωλήνωσης από το οποίο μπορούμε να διαβάσουμε ενώ ο περιγραφέας fd[1] προσδιορίζει το άκρο της σωλήνωσης στο οποίο γράφουμε. Τα στοιχεία που γράφονται στο ένα άκρο της σωλήνωσης μπορούν να διαβαστούν από το άλλο. Επειδή οι περιγραφείς κληρονομούνται ανάμεσα σε διεργασίες η σωλήνωση μπορεί να χρησιμοποιηθεί για διαδιεργασιακή επικοινωνία. Ένα απλό παράδειγμα χρήσης της pipe() είναι το παρακάτω:
	int fd[2], n;
	char buff[100];

	pipe(fd);
	write(fd[1], "hello", 5);
	n = read(fd[0], buff, 100);
	write(1, buff, n);

Παράδειγμα

Με τη χρήση της pipe() στείλτε ένα μήνυμα από μια διεργασία σε άλλη την οποία δημιουργήσατε με τη fork().

Βιβλιογραφία