0% ont trouvé ce document utile (0 vote)
39 vues7 pages

TP 6

Le document présente plusieurs exercices de programmation en C, incluant des exemples d'utilisation de fork, execlp et wait. Les exercices abordent des concepts tels que la création de processus fils, la gestion des retours d'état et l'exécution de commandes système. Les programmes illustrent des scénarios variés comme la résolution d'équations quadratiques et la gestion de fichiers.

Transféré par

benbernou.sabri
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats TXT, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
39 vues7 pages

TP 6

Le document présente plusieurs exercices de programmation en C, incluant des exemples d'utilisation de fork, execlp et wait. Les exercices abordent des concepts tels que la création de processus fils, la gestion des retours d'état et l'exécution de commandes système. Les programmes illustrent des scénarios variés comme la résolution d'équations quadratiques et la gestion de fichiers.

Transféré par

benbernou.sabri
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats TXT, PDF, TXT ou lisez en ligne sur Scribd

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); }}}

Vous aimerez peut-être aussi