Processus
Exercice 1
Ecrire un programme C qui crée deux fils, l'un affiche les entiers de 1 à 50, l'autre de 51 à 100.
Corrigé
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{ pid_t pid;
int i;
Exercice 2
Modifier le programme précédent pour que l'affichage soit 1 2...100.
Corrigé
Peut-être les nombres s'affichent déjà en ordre. Pour observer l'exécution asynchrone des deux fils,
ajoutez une boucle de ralentissement, par exemple
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{ pid_t pid;
int i, j;
double x = 123.456;
Pour synchroniser l'affichage, il suffit d'ajouter wait avant la crèation du second fils.
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{ pid_t pid;
int i, j;
double x = 123.456;
wait(NULL);
Exercice 3
Ecrire un programme C permettant de lancer la commande passée en argument.
Corrigé
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
Exemples d'exécution
[stefan@ecrins tp]$ monexec ls -l /etc/httpd/conf.d/
total 36
-rw-r--r-- 1 root root 3424 Sep 2 2002 auth_pgsql.conf
-rw-r--r-- 1 root root 814 Sep 3 2002 perl.conf
-rw-r--r-- 1 root root 459 Sep 3 2002 php.conf
-rw-r--r-- 1 root root 988 Sep 2 2002 python.conf
-rw-r--r-- 1 root root 180 Sep 4 2002 README
-rw-r--r-- 1 root root 251 Aug 6 2002 squirrelmail.conf
-rw-r--r-- 1 root root 11140 Sep 4 2002 ssl.conf
[stefan@ecrins tp]$ monexec echo a b
a b
[stefan@ecrins tp]$ monexec
Usage: monexec commande [arg] [arg] ...
[stefan@ecrins tp]$ monexec toto titi
execvp: No such file or directory
Exercice 4
Ecrire un programme C équivalent à la commande shell suivante :
Corrigé
int main(void)
{ pid_t pid;
int main(void)
{ pid_t pid;
wait(NULL);
if ((pid = fork()) == -1)
{ perror("fork"); exit(1);
}
if (pid == 0)
{ execlp("ps", "ps", NULL);
perror("execlp");
exit(1);
}
wait(NULL);
execlp("ls", "ls", "-l", NULL);
perror("execlp");
exit(1);
}
Exercice 5
Ecrire un programme C qui prend en paramètre une série de fichiers source .c, les compile chacun
séparément et simultanément puis édite les liens pour produire un exécutable. Ce programme doit :
• lancer un processus fils pour chacun des noms de fichiers passés en paramètre;
• chaque fils doit exécuter le programme gcc -c sur le fichier dont il s'occupe;
• le père doit attendre la terminaison de tous ses fils;
• si l'ensemble des fils ont terminés sans erreur, le père réalise l'édition de liens en exécutant gcc
sur les fichiers .o produits par les fils.
Envoyez votre programme ici. N'oubliez pas à préciser votre nom et prénom.