Grosse MàJ
This commit is contained in:
90
P5B/ruby/161007/TRAVAIL_A_FAIRE
Normal file
90
P5B/ruby/161007/TRAVAIL_A_FAIRE
Normal file
@ -0,0 +1,90 @@
|
||||
EXEMPLES ET EXERCICES
|
||||
|
||||
|
||||
|
||||
|
||||
1. adresses sites
|
||||
|
||||
Quelques adresses utiles :
|
||||
|
||||
http://www.rubycentral.com/book/ // le livre de reference
|
||||
http://www.rubycentral.com/ref/ // ref. classes avec listes des fonctions par classe
|
||||
http://www.ruby-doc.org/core/ // voir les classes IO File File::Stat Dir FileTest Process
|
||||
|
||||
|
||||
|
||||
2. exemples de scripts
|
||||
|
||||
NB: tester d'abord les exemples avant de faire les exercices propos<6F>s.
|
||||
|
||||
|
||||
A. manipulation du SGF
|
||||
======================
|
||||
|
||||
Bcp de classes participent <20> la manipulation des objets "syst<73>me" : File, Dir, IO, etc...
|
||||
|
||||
|
||||
- exemple 1 : cr<63>ation d'un fichier et remplissage <20> partir d'infos saisies au clavier (testSgf_1.rb)
|
||||
|
||||
- exemple 2 : ouverture et affichage des informations sur un fichier (stat) (testSgf_2.rb)
|
||||
|
||||
- exemple 3 : ouverture d'un fichier avec v<>rification existence et recherche des lignes ou
|
||||
apparait un motif donne .
|
||||
Le nom du fichier et le motif sont pass<73>s en param<61>tres au script (testSgf_3.rb)
|
||||
|
||||
- exemple 4 : afficher la liste des fichiers d'un repertoire donne (testSgf_4.rb)
|
||||
|
||||
|
||||
- Exercices <20> faire
|
||||
|
||||
- Exercice 1 : <20>crire un script < histo > qui construit et affiche l'histogramme de repartition
|
||||
par taille des fichiers du repertoire <rep>.
|
||||
Nous aimerions conna<6E>tre la taille totale de fichiers examin<69>s, le nombre total de ces derniers et le nombre total de blocs.
|
||||
Ainsi que la taille moyenne d'un fichier.
|
||||
On definit <nbclasses> classes de repartition de taille identique <20> <taille>
|
||||
|
||||
usage : histo.rb <repertoire > <nombre_de_classe> <taille_de_classe>
|
||||
|
||||
- Exercice 2 : <20>crire un script <cherche> qui recherche tous les fichiers contenant un motif donn<6E>.
|
||||
On affichera le nom du fichier et la ligne contenant le motif. Attention,
|
||||
si plusieurs lignes du m<>me fichier contiennent <motif>, on n'affichera qu'une fois
|
||||
le chemin absolu du fichier.
|
||||
|
||||
usage : cherche <motif> [filtre] [path]
|
||||
|
||||
|
||||
B. manipulation de processus, signaux
|
||||
=====================================
|
||||
|
||||
- exemple 1 : cr<63>ation d'un processus fils (testProc_1.rb)
|
||||
Si on comment les lignes if avec les exit, on obtient ceci :
|
||||
|
||||
Pere 28716 Grand pere 28715 pid fils1 : nil pid fils2 : nil
|
||||
|
||||
Pere 28715 Grand pere 28713 pid fils1 : nil pid fils2 : 28716
|
||||
|
||||
Pere 28717 Grand pere 28713 pid fils1 : 28715 pid fils2 : nil
|
||||
|
||||
Pere 28713 Grand pere 22590 pid fils1 : 28715 pid fils2 : 28717
|
||||
|
||||
Donc le petit fils ne connait pas les autres
|
||||
Le fils 2 se connait
|
||||
Le fils 1 aussi
|
||||
Et le p<>re connait les fils 1 et 2
|
||||
|
||||
- exemple 2 : communication entre un proc. p<>re et un proc. fils avec un tube (testProc_2.rb)
|
||||
|
||||
- exemple 3 : communication entre un proc. p<>re et un proc. fils avec un tube (2) (testProc_3.rb)
|
||||
Si on enl<6E>ve le wr.close du Process.fork, alors le programme bloque, car quelqu'un utilise toujours le WR !
|
||||
|
||||
- exemple 4 : chronom<6F>tre (testSig_1.rb)
|
||||
|
||||
|
||||
- Exercices <20> faire
|
||||
|
||||
- Exercice 1 : <20>crire un script qui ex<65>cute la commande "ls -l" en affichant le r<>sultat
|
||||
en majuscule. On utilisera 2 processus et un tube pour communiquer.
|
||||
Le proc. fils ex<65>cute la commande et le proc. p<>re affiche en majuscule.
|
||||
|
||||
|
||||
NB: pour passer en mode debug, lancer : ruby -r debug ./testFile.rb <liste_arg>
|
52
P5B/ruby/161007/histo.rb
Normal file
52
P5B/ruby/161007/histo.rb
Normal file
@ -0,0 +1,52 @@
|
||||
#!/usr/bin/ruby -w
|
||||
|
||||
# Affiche un histogramme du nombre de fichiers tri<72>s par classe de grandeur "tailleClasse" sur un nombre "nombreDeClasse".
|
||||
|
||||
# R<>cup<75>ration des argument
|
||||
if ARGV.length < 3
|
||||
puts "Utilisation : ./histo.rb < nomRep > < nbreDeClasse > < tailleClasse (en octet) >"
|
||||
exit
|
||||
end
|
||||
|
||||
# attribution d'<27>l<EFBFBD>ments
|
||||
|
||||
rep=ARGV[0]
|
||||
nbr=ARGV[1].to_i
|
||||
taille=ARGV[2].to_i
|
||||
|
||||
# initialisation de certaines variables
|
||||
|
||||
nbrFichiers = 0
|
||||
tailleTotale = 0
|
||||
tailleTotaleBlocs = 0
|
||||
histogramme = []
|
||||
for i in 0 ... nbr do
|
||||
histogramme[i] = 0
|
||||
end
|
||||
|
||||
# Nous allons dans le r<>pertoire courant
|
||||
Dir.chdir(rep)
|
||||
|
||||
repertoireOuvert=Dir.open(rep)
|
||||
|
||||
repertoireOuvert.each do |entree|
|
||||
if File.file?(entree)
|
||||
fichier = File.open(entree,"r")
|
||||
stats = fichier.stat
|
||||
colonne = stats.size / taille
|
||||
histogramme[colonne] = histogramme[colonne].to_i + 1
|
||||
nbrFichiers = nbrFichiers + 1
|
||||
tailleTotale = tailleTotale + stats.size
|
||||
tailleTotaleBlocs = tailleTotaleBlocs + stats.blocks.to_i
|
||||
end
|
||||
end
|
||||
|
||||
histogramme.each do |element|
|
||||
print(element.to_s, " | ")
|
||||
end
|
||||
|
||||
puts "\nNombre total de fichiers examin<69>s : #{nbrFichiers}"
|
||||
puts "Taille totale : #{tailleTotale}"
|
||||
puts "Nombre total de blocs lus : #{tailleTotaleBlocs}"
|
||||
tailleMoyenneFichier = tailleTotale / nbrFichiers
|
||||
puts "Taille moyenne d'un fichier : #{tailleMoyenneFichier}"
|
25
P5B/ruby/161007/testProc_1.rb
Normal file
25
P5B/ruby/161007/testProc_1.rb
Normal file
@ -0,0 +1,25 @@
|
||||
#! /usr/bin/ruby -w
|
||||
#
|
||||
system("clear")
|
||||
|
||||
# creation d'un fils et d'un petit fils
|
||||
|
||||
pid1 = Process.fork
|
||||
|
||||
if pid1 == nil
|
||||
Process.exit!(-1) #on sort si on est dans le fils
|
||||
end
|
||||
|
||||
pid2 = Process.fork
|
||||
|
||||
if pid2 == nil # on sort si on est dans le fils
|
||||
Process.exit!(0)
|
||||
end
|
||||
|
||||
print "\nPere \t" , Process.pid , "\tGrand pere\t", Process.ppid(), "\tpid fils1 :\t" , pid1, "\tpid fils2 :\t" ,
|
||||
pid2, "\n"
|
||||
|
||||
|
||||
sleep 2.5
|
||||
|
||||
print "\nFin"
|
22
P5B/ruby/161007/testProc_2.rb
Normal file
22
P5B/ruby/161007/testProc_2.rb
Normal file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/ruby -w
|
||||
|
||||
# utilisation d'un tube entre 2 processus
|
||||
|
||||
rd, wr = IO.pipe # creation d'un tube avec 2 descripteurs pour lect/ecri
|
||||
|
||||
if fork # le pere ferme le desc. pour ecrire dans le tube
|
||||
wr.close
|
||||
ch=rd.read # est bloque tant que rien dans le tube
|
||||
puts "message recu par le Pere : " + ch
|
||||
rd.close
|
||||
Process.wait # on attend la fin du fils
|
||||
puts "le pere termine"
|
||||
|
||||
else # le fils
|
||||
rd.close # ferme tube en lecture
|
||||
puts "envoi d'un message "
|
||||
wr.write "ceci est un test"
|
||||
puts "le fils termine dans 2 secondes"
|
||||
sleep 2
|
||||
wr.close
|
||||
end
|
34
P5B/ruby/161007/testProc_3.rb
Normal file
34
P5B/ruby/161007/testProc_3.rb
Normal file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/ruby -w
|
||||
|
||||
system("clear")
|
||||
rd, wr = IO.pipe
|
||||
|
||||
print "\nPere : creation processus fils"
|
||||
|
||||
if Process.fork
|
||||
wr.close
|
||||
print "\nPere : lecture donnee depuis tube rd"
|
||||
sleep 1
|
||||
|
||||
while ! rd.eof
|
||||
c=rd.readchar
|
||||
print "\ncaractere recu...."
|
||||
putc c
|
||||
print "\nattente...."
|
||||
sleep 3
|
||||
end
|
||||
print "\nfin lecteur*\n"
|
||||
rd.close
|
||||
|
||||
else
|
||||
rd.close
|
||||
sleep 1
|
||||
print "\nFils : envoi donnee vers tube wr"
|
||||
for i in 'a'..'g'
|
||||
print "\n------>envoi du caractere ", i
|
||||
wr.write i
|
||||
sleep 1
|
||||
end
|
||||
print "\nfin redacteur*\n"
|
||||
wr.close
|
||||
end
|
32
P5B/ruby/161007/testSgf_1.rb
Normal file
32
P5B/ruby/161007/testSgf_1.rb
Normal file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/ruby -w
|
||||
|
||||
# lecture de donnee au clavier ou en redirigeant l'entree std
|
||||
# fin de fichier provoquee par Ctrl D ou fin entree std
|
||||
|
||||
f = File.new("testfile","w+")
|
||||
|
||||
|
||||
while s=gets do
|
||||
f.write(s) # ou f.puts s
|
||||
end
|
||||
|
||||
puts "\n\nrelecture du fichier \n"
|
||||
|
||||
f.rewind # revient au debut idem a f.lineno = 0
|
||||
puts f.lineno
|
||||
|
||||
while not f.eof do
|
||||
puts f.read
|
||||
end
|
||||
|
||||
# insertion dans le fichier
|
||||
|
||||
f.seek(0, IO::SEEK_SET)
|
||||
f.seek(100,IO::SEEK_CUR)
|
||||
|
||||
f.puts( "INSERTION A LA POSITION 100")
|
||||
|
||||
# verifier que l'insertion est bien effectuee en position 100
|
||||
# utiliser la cde od -c testfile
|
||||
|
||||
puts "*stop*"
|
22
P5B/ruby/161007/testSgf_2.rb
Normal file
22
P5B/ruby/161007/testSgf_2.rb
Normal file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/ruby -w
|
||||
|
||||
# affichage infos sur un fichier
|
||||
|
||||
f = File.open("testfile","r")
|
||||
|
||||
# on recupere les infos grace a la methode stat -> objet aStat
|
||||
|
||||
s = f.stat
|
||||
|
||||
puts "\n\naffichage info fichier \n"
|
||||
|
||||
|
||||
puts s # -> affiche reference memoire objet s !
|
||||
|
||||
|
||||
puts "chemin absolu :" + File.expand_path(f.path)
|
||||
puts "taille du fichier : " + s.size.to_s
|
||||
puts "nombre de blocs : " + s.blocks.to_s
|
||||
puts "fichier regulier: " + s.file?.to_s
|
||||
puts "repertoire : " + s.directory?.to_s
|
||||
puts "num<EFBFBD>ro de possesseur : " + s.uid.to_s
|
32
P5B/ruby/161007/testSgf_3.rb
Normal file
32
P5B/ruby/161007/testSgf_3.rb
Normal file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/ruby -w
|
||||
|
||||
# recherche d'une chaine dans un fichier donne
|
||||
# nom et chaine sont passes en argument
|
||||
|
||||
if ARGV.length < 2
|
||||
puts "usage : ./testFile_3 nom_fich motif"
|
||||
exit
|
||||
end
|
||||
|
||||
nomFich = ARGV[0]
|
||||
motif = ARGV[1]
|
||||
|
||||
# test si fichier existe et fichier regulier
|
||||
|
||||
if not File.file?(nomFich)
|
||||
puts "erreur fichier"
|
||||
exit
|
||||
end
|
||||
|
||||
f = File.open(nomFich,"r") # ouverture du fichier
|
||||
|
||||
|
||||
puts "\n_______________________________________________\n"
|
||||
puts "\n\naffichage des lignes du fichier contenant " + motif
|
||||
puts "\n_______________________________________________\n"
|
||||
|
||||
f.grep(/#{motif}/) do |line|
|
||||
puts line.chomp + " (" + f.lineno.to_s + " )" # On affiche la ligne et le motif
|
||||
end
|
||||
|
||||
puts "fin"
|
39
P5B/ruby/161007/testSgf_4.rb
Normal file
39
P5B/ruby/161007/testSgf_4.rb
Normal file
@ -0,0 +1,39 @@
|
||||
#!/usr/bin/ruby -w
|
||||
|
||||
# affiche la liste des fichiers du repertoire en argument
|
||||
|
||||
|
||||
if ARGV.length < 1
|
||||
puts "usage : ./testSgf_4.rb < nomRep >"
|
||||
exit
|
||||
end
|
||||
|
||||
rep=ARGV[0]
|
||||
|
||||
#changement de repertoire
|
||||
|
||||
|
||||
Dir.chdir(rep)
|
||||
|
||||
d=Dir.open(rep)
|
||||
|
||||
d.each { |u| puts u }
|
||||
|
||||
puts "_____________REPERTOIRE_______________"
|
||||
|
||||
# si on veut filter les fichiers du repertoire
|
||||
|
||||
|
||||
Dir["*.rb"].each do |f|
|
||||
puts f
|
||||
end
|
||||
|
||||
|
||||
puts "_____________ARBORESCENCE_____________"
|
||||
|
||||
# si on veut parcourir toute la sous-arborescence
|
||||
|
||||
|
||||
Dir["**/*.rb"].each do |f|
|
||||
puts f
|
||||
end
|
18
P5B/ruby/161007/testSig_1.rb
Normal file
18
P5B/ruby/161007/testSig_1.rb
Normal file
@ -0,0 +1,18 @@
|
||||
#!/usr/bin/ruby -w
|
||||
|
||||
nsec=0
|
||||
|
||||
trap("SIGINT" ){ #attention a la place de la parenthese ouvrante
|
||||
puts "\n"+nsec.to_s + " secondes ecoulees \n"
|
||||
}
|
||||
|
||||
|
||||
trap("SIGQUIT" ){ #attention a la place de la parenthese ouvrante
|
||||
puts "\nFin du chronom<6F>tre "+nsec.to_s + " secondes ecoulees \n"
|
||||
exit
|
||||
}
|
||||
|
||||
while true
|
||||
sleep 1
|
||||
nsec = nsec + 1
|
||||
end
|
BIN
P5B/ruby/161007/testfile
Normal file
BIN
P5B/ruby/161007/testfile
Normal file
Binary file not shown.
10
P5B/ruby/161007/url.net
Normal file
10
P5B/ruby/161007/url.net
Normal file
@ -0,0 +1,10 @@
|
||||
|
||||
Quelques adresses utiles
|
||||
|
||||
|
||||
http://www.rubycentral.com/book/ // le livre de reference
|
||||
|
||||
http://www.ruby-doc.org/docs/ProgrammingRuby/ // ref. classes avec listes des fonctions par classe
|
||||
|
||||
http://www.ruby-doc.org/core/ // voir les classes IO File File::Stat Dir FileTest Process
|
||||
|
Reference in New Issue
Block a user