Exercice 1
Q3)
// exo1-3.c
#include <stdio.h>
#include <unistd.h> //fork
#include <stdlib.h> //exit
// Le programme principal
main()
{int pid;
printf("je suis le père de pid : %d bonjour \n", getpid());
pid=fork();
if (pid==-1)
{ perror("erreur sur fork \n");
exit(-1); }
else
if (pid==0)
//exécution du fils 1
{printf("je suis le fils 1 de pid : %d , mon père: %d bonjour
\n", getpid(), getppid());
printf("je suis le fils 1 de pid : %d , mon père: %d au revoir
\n", getpid(),getppid());
exit(0);
}
else
//exécution du père
pid=fork();
if (pid==-1)
{ perror("erreur sur fork \n");
exit(-1); }
else
if (pid==0)
//exécution du fils 2
{printf("je suis le fils 2 de pid : %d , mon père: %d bonjour
\n", getpid(), getppid());
sleep(1);
printf("je suis le fils 2 de pid : %d , mon père: %d au revoir
\n", getpid(),getppid());
exit(0);
}
else
//exécution du père
sleep(3);
printf("\n je suis le père de pid : %d au revoir \n", getpid());
}
Q4)
// exo1-4.c
#include <stdio.h>
#include <unistd.h> //fork
#include <stdlib.h> //exit
// Le programme principal
main()
{int pid;
printf("je suis le père de pid : %d bonjour \n", getpid());
pid=fork();
if (pid==-1)
{ perror("erreur sur fork \n");
exit(-1); }
else
if (pid==0)
//exécution du fils 1
{printf("je suis le fils 1 de pid : %d , mon père: %d bonjour
\n", getpid(), getppid());
printf("je suis le fils 1 de pid : %d , mon père: %d au revoir
\n", getpid(),getppid());
exit(0);
}
else
//exécution du père
//attendre la fin du premier fils
wait();
Printf("terminaison du premier fils \n");
// création du fils 2
pid=fork();
if (pid==-1)
{ perror("erreur sur fork \n");
exit(-1); }
else
if (pid==0)
//exécution du fils 2
{printf("je suis le fils 2 de pid : %d , mon père: %d bonjour
\n", getpid(), getppid());
sleep(1);
printf("je suis le fils 2 de pid : %d , mon père: %d au revoir
\n", getpid(),getppid());
exit(0);
}
else
//exécution du père
//attendre la fin du deuxième fils
wait();
Printf("terminaison du deuxième fils \n");
printf("je suis le père de pid : %d au revoir \n", getpid());
}
Exercice 2
Q3)
#include <stdio.h>
#include <unistd.h> // execlp
#include <stdlib.h> // exit
int menu()
{
printf("1– Editer avec vi \n");
printf("2– Afficher un fichier \n");
printf ("3– Détruire un fichier \n");
printf ("4– Lister un fichier \n");
printf("\n Votre choix ? ");
int choix;
scanf("%d", &choix);
return choix;
}
void main(int argc, char* argv[])
{
if (argc < 2)
{
printf ("il faut donner un nom de fichier \n");
exit(1);
}
char* fichier=argv[1] ;
char* param;
if (argc > 2)
param=argv[2] ;
switch (menu())
{
case 1: execlp("vi", "vi", fichier, NULL);
break;
case 2: execlp("cat", "cat", fichier, NULL);
break;
case 3: execlp("rm", "rm", "-i", fichier, NULL);
break;
case 4: execlp("ls", "ls", param, fichier, NULL);
break;
}
perror ("Erreur sur Execlp"); // message écrit en cas d'erreur
printf("Fin du programme \n");
Console : exécution
$gcc exo3-3.c –o exo3-3
$./exo3-3 fichier
1– Editer avec vi
2– Afficher un fichier
3– Détruire un fichier
4– Lister un fichier
Votre choix ? 1
…… (composer un fichier dans vi)
$./exo2-3 –al fichier
…… (lister la liste des fichiers)
Q4)
// Programme Somme trois entiers exo2-4.c
#include <stdio.h>
#include <unistd.h> //execlp
#include <stdlib.h> //exit
main(int argc, char* argv[])
{
int a,b,c;
if (argc !=4)
{
printf("Nombre d'arguments insuffisant \n");
exit(1);
}
a=atoi(argv[1]);
b=atoi(argv[2]);
c=atoi(argv[3]);
printf("argc: %d \n",argc);
printf("Resultat %d, A: %d, B: %d, C: %d \n" ,a+b+c, a,b,c);
}
// Fin du programme exo2-4.c
//Programme lancer.c
#include <stdio.h>
#include <unistd.h> //execlp
#include <stdlib.h> //exit
main(int argc, char* argv[])
{
//ce programme lance l'exécution du exo3-4 qui fait la somme
execv("./exo3-4",argv);
}
// Fin du programme lancer.c
L’exécution des deux programmes exo3-4.c et lancer.c s’effectue comme
suit :
$gcc exo2-4.c -o exo2-4
$gcc lancer.c –o lancer
$./lancer 23 14 19
$56
Exercice 3
// Eqt.c
#include <unistd.h> // fork et execlp
#include <sys/wait.h> // pour wait
#include <stdlib.h> // exit
#include <stdio.h> // E/S
#include <math.h> // sqrt et pow
int a,b,c, x1, x2, delta;
pid_t pid1, pid2, pid3, pid4;
void main()
{
while (1)
{
printf("Donner la valeur de a:\n");
scanf("%d",&a);
printf("Donner la valeur de b:\n");
scanf("%d",&b);
printf("Donner la valeur de c:\n");
scanf("%d",&c);
delta=b*b-4*a*c;
printf("la valeur de delta= : %d\n", delta);
if (delta >0) //scénario 1
{
// fils 1
pid1 = fork();
if(pid1 == 0)
{
x1=(-b-sqrt(delta))/2*a;
printf("x1= : %d\n", x1);
exit(0);
}
else
{
// fils 2
pid2 = fork();
if(pid2 == 0)
{
x2=(-b+sqrt(delta))/2*a;
printf("x2= : %d\n", x2);
exit(0);
}
while (wait(NULL)!=-1);
}
}
else if (delta == 0) // scénario 2
{
// fils 3
pid3 = fork();
if(pid3 == 0){
x1=(-b/(2*a));
printf("x1= : %d\n", x1);
exit(0);
}
else wait(0);
}
else // scénario 3
{
pid4=fork();
if(pid4==0)
{
execlp("./stop", "stop", NULL);
}
else wait(0);
}
}
}
// stop.c
#include <stdio.h>
int main()
{
printf("Le processus de résolution des équations est terminé \n");
Exercice 4
// exo4.c (Utilisation de waitpid)
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
// Le programme principal
main()
{int codea, codeb, codec, a, b, c, f1, f2, f3, etat;
f1=fork();
if (f1==-1)
{ perror("erreur sur fork \n"); exit(-1); }
else
if (f1==0)
//exécution du fils f1
{
printf("je suis le fils 1 : %d mon père: %d \n", getpid(), getppid());
exit(5); }
else
{
//exécution du père
f2=fork();
if (f2==-1)
{ perror("erreur sur fork \n"); exit(-1); }
else
if (f2==0)
//exécution du fils f2
{
printf("je suis le fils 2: %d mon père: %d \n", getpid(), getppid());
exit(10); }
else
{
//exécution du père
f3=fork();
if (f3==-1)
{ perror("erreur sur fork \n"); exit(-1); }
else
if (f3==0)
//exécution du fils f3
{
printf("je suis le fils3 : %d mon père: %d \n", getpid(), getppid());
exit(3); }
else
//exécution du père
{
a=waitpid(f1,&etat,0);
if(WIFEXITED(etat))codea=WEXITSTATUS(etat);
b=waitpid(f2,&etat,0);
if(WIFEXITED(etat))codeb=WEXITSTATUS(etat);
c=waitpid(f3,&etat,0);
if(WIFEXITED(etat))codec=WEXITSTATUS(etat);
printf("je suis le père, le code de retour du fils1: %d \n", codea);
printf("je suis le père, le code de retour du fils2: %d \n", codeb);
printf("je suis le père, le code de retour du fils3: %d \n", codec);
printf("le résultat égal à: %d \n", codea*codeb+codec); }
exit(0); }}}