Processus commandes UNIX et programmation C IUT du Havre Cours - TP
Plan
Plan Commandes 1 Quelques nouvelles commandes de gestion des processus Commande at Commande crontab Commande time 2 de processus
Commande at Commandes Commande at Commande crontab Commande time at permet de différer l exécution d une ou d un ensemble de commandes applications : synchronisation de deux serveurs (opération généralement nocturne), alertes, réveil...
Synopsis de la commande Commande at Commande crontab Commande time at [-f script] HEURE [date] HEURE [date] peut s exprimer de différentes manières : 12 :45 pour indiquer une heure dans la journée (ou le lendemain si l heure est passée), 13 :27 + 2 days (à 13h27 dans deux jours) 4pm Jul 31 midnight 12/31/2005 (Bonne année)
Exemple Commandes Commande at Commande crontab Commande time On désire déterminer l espace utilisé par chaque utilisateur sur le disque local. La commande est du -sh /home/utilisateur/, il faut donc faire la liste des utilisateurs et lancer la commande pour chacun d eux, d où le script du-all.sh : for i in ls do du -sh $i >> /tmp/du_utilisateurs done Commande : at 14 :43 -f du-all.sh
Commande associée Commandes Commande at Commande crontab Commande time atq permet de connaître les commandes qui sont en attente, équivalent à at -l, atrm permet de supprimer certaines commandes qui sont en attente, équivalent à at -d, > at 12 :15 -f commande-at warning : commands will be executed using (in order) a) $SHELL b) lo job 6 at 2006-01-04 12 :15 > atq 6 2006-01-04 12 :15 a guinand > atrm 6 > atq
Commande crontab Commandes Commande at Commande crontab Commande time proche de la commande at, mais permet de gérer un ensemble de travaux et d introduire facilement de la périodicité applications identiques à at, mais permet d exprimer la périodicité des travaux de manière fine, crontab permet de gérer les tables qui pilotent le fonctionnement du démon cron
Synopsis de la commande Commande at Commande crontab Commande time crontab fichier-contenant-les-lignes-de-la-crontab crontab -l : affiche la cron table de l utilisateur crontab -r : supprime la cron table de l utilisateur crontab -e : édite la cron table de l utilisateur
Commande at Commande crontab Commande time Format des lignes de la cron table Le symbole # représente un commentaire chaque ligne est constituée de 6 champs, séparés par des espaces. Ces champs représentent dans l ordre : 1 Les minutes (de 0 à 59). 2 Les heures (de 0 à 23). 3 Les jours du mois (de 1 à 31). 4 Les mois (de 1 à 12). 5 Les jours de la semaine (de 0 à 6, 0=Dimanche, 6=Samedi). 6 Enfin le programme à exécuter.
Commande at Commande crontab Commande time Format des lignes de la cron table Quel que soit le champ, il est possible de spécifier : une valeur simple : 8 un ensemble de valeurs : 2,3,4,5 un intervalle de valeurs : 2-8 toutes les valeurs du champ : * toutes les 3 valeurs entre les bornes de l intervalle : 8-20/2 (exemple, toutes les 2 heures entre 8 et 20 heures).
Exemple Commandes Commande at Commande crontab Commande time On veut compter le nombre de processus d un utilisateur donné toutes les 2 minutes entre 7h et 23h, tous les jours, sauf le samedi et le dimanche, et pour le seul mois de janvier. Ce comptage est assuré par le script ps-cron.sh. On rangera ce nombre dans un fichier /tmp/nb-procs : ps -aux grep utilisateur wc -l >> /tmp/nb-procs
Installation de la cron table Commande at Commande crontab Commande time > crontab -e on édite le fichier */2 7-23 * 1 1-5 ps-cron.sh on sauve > crontab -l # DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.22735 installed on Wed Jan 4 16 :54 :01 2006) # (Cron version $Id : crontab.c,v 2.13 1994/01/17 03 :20 :37 vixie Ex */2 7-23 * 1 1-5 ps-cron.sh
Commande time Commandes Commande at Commande crontab Commande time cette commande permet de connaître le temps d exécution d un programme donné, exemple : time mon-programme avec ses paramètres > time du -sh 12G /home/guinand 0.08user 0.19system 0 :00.28elapsed 99%CPU (0avgtext+0avgdata % 0inputs+0outputs (0major+459minor)pagefaults 0swaps
d un processus lancement d un programme création d un processus par le shell création dynamique de processus? primitive fork
Synopsis Commandes #include<sys/types.h> #include<unistd.h> pid_t fork(void) ;
Primitive fork() Commandes fork() créé un nouveau processus à partir d un processus existant, le nouveau processus est appelé processus fils et l existant est appelé processus père, la valeur de retour de fork() prend une valeur différente dans le processus père et dans le processus fils : 0 dans le fils le pid du processus fils dans le père -1 en cas d échec
Un premier exemple en C #include<unistd.h> #include <sys/types.h> #include<stdio.h> main() { pid_t pid ; switch(pid=fork()) { case(pid_t)-1 : perror("pb dans le fork") ; exit(2) ; case(pid_t)0 : printf("valeur de fork = %d \n",pid) ; printf("je suis %d, mon père est %d \n",getpid(),getppid()) ; exit(0) ; default : printf("valeur de fork = %d \n",pid) ; printf("je suis le père %d et mon père est %d \n",getpid(),getppid()) ; exit(0) ; } }
Suite Commandes main() { pid_t pid ; int a = 10 ; printf( %d : a vaut %d,getpid(),a) ; switch(pid=fork()) { case(pid_t)-1 :... case(pid_t)0 : printf( %d : a vaut %d,getpid(),a) ; a++ ;... break ; default : printf( %d : a vaut %d,getpid(),a) ;... break ; } printf( %d : a vaut %d,getpid(),a) ; }
Quelques expériences Initialisez une variable entière avant l appel du fork() et modifiez-la dans le code du fils, que se passe-t-il? Que peut-on en déduire? on fait compter le processus père et le processus fils jusqu à 100, 200 puis 1000. Comment cela se passe-t-il? Que peut-on en déduire? Arrive-t-il des situations particulières? modifiez le programme de telle sorte que le père et le fils au début et à la fin du comptage indiquent qui ils sont et qui sont leur père. Que constatez-vous? Pourquoi?
Quelques éléments de réponse Initialisez une variable entière avant l appel du fork() et modifiez-la dans le code du fils, que se passe-t-il? Que peut-on en déduire? On constate que les deux valeurs ne sont pas identiques, chaque processus travaille sur sa propre copie des données
Quelques éléments de réponse on fait compter le processus père et le processus fils jusqu à 100, 200 puis 1000. Comment cela se passe-t-il? Que peut-on en déduire? Arrive-t-il des situations particulières? jusqu à 100, le fils termine son décompte avant que le père n ait pu commencé, mais les choses changent lorsque la valeur est grande on peut en déduire que les deux processus sont ordonnancés de manière indépendante l un de l autre, on constate également quelque fois que le prompt ne réapparaît pas à la fin de l exécution.
Effet de l ordonnancement
Quelques éléments de réponse modifiez le programme de telle sorte que le père et le fils au début et à la fin du comptage indiquent qui ils sont et qui est leur père. Que constatez-vous? Pourquoi? on constate que pour certaines exécutions, le fils n a plus son père, ceci se produit lorsque le père termine son exécution avant que son fils n ait terminé la sienne. Pour conserver l arborescence des processus, le fils est rattaché, par le système, à un autre processus.
Application au tri par insertion On va réaliser le tri par insertion avec un programme C simple et avec un programme qui partage le travail entre le père et le fils. Principe : création d un tableau par le père père et fils remplissent puis trient leur tableau attente de la fin du fils par le père le père réalise la fusion des résultats
Synchronisation père/fils rien ne garantie que le fils se termine avant le père le père doit attendre la fin du processus fils pour accéder aux résultats primitive de synchronisation : waitpid() l appel à cette primitive par le processus père le bloque tant que le fils n est pas terminé
Synopsis Commandes #include <sys/types.h> #include <sys/wait.h> pid_t wait (int * status) ; pid_t waitpid (pid_t pid, int * status, int options) ; status apporte des informations sur les conditions d arrêt du fils (pour nos exemples, ce sera généralement (int *)NULL), options permet d effectuer un appel non bloquant et d avoir des informations sur les fils bloqués (généralement 0).
Exemple - Commandes reprenez le code de comptage ajouter la primitive waitpid() faites-le tourner pour de grandes valeurs que se passe-t-il?
Exercice Commandes reprenez le code précédent et modifiez-le de telle sorte que le père et le fils effectuent un tri par insertion de leur tableau et écrivent leur résultat chacun dans un fichier écrire une procédure de fusion des résultats à partir de deux tableaux de taille N/2 en un tableau de taille N et qui sauvegarde le nouveau tableau dans un fichier (on prendra celui du père) effectuez une comparaison en temps (time) du tri d un tableau de 2n éléments (de l ordre de plusieurs dizaines de miliers) par un processus seul, puis faites la même expérience avec votre code. Que constatez-vous?