0% ont trouvé ce document utile (0 vote)
45 vues3 pages

Dignauxcorrigé

Le document contient plusieurs exemples de code C illustrant l'utilisation de processus et de signaux sous Linux. Les exemples montrent la création de processus enfants, l'envoi de signaux entre processus et la gestion d'erreurs.

Transféré par

firastech2
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 DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
45 vues3 pages

Dignauxcorrigé

Le document contient plusieurs exemples de code C illustrant l'utilisation de processus et de signaux sous Linux. Les exemples montrent la création de processus enfants, l'envoi de signaux entre processus et la gestion d'erreurs.

Transféré par

firastech2
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 DOCX, PDF, TXT ou lisez en ligne sur Scribd

EX1

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int main()
{
pid_t pf;
if (pf=fork() )
{
char choix;
do {
do {
printf("Entrer un choix d'opération\n\ts : pour endormir le fils\n\tr :pour reprendre son exécution\n\tq : pour terminer le fils et quitter\n");
choix=getchar();
fflush(stdin);
}
while((choix!='q') && (choix!='s') && (choix!='r'));
switch( choix)
{
case 'q':
kill(pf,SIGKILL);
exit(0);
case 's':
kill(pf,SIGSTOP);
break;
case 'r':
kill(pf,SIGCONT);
break;
default:
break;
}
}
while(1);

}
else
{
while(1) {
printf("\n je tourne");
sleep(1);
}
}
return 0;
}

EX2

Afficher

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main()
{
int entier;
FILE *fp=fopen("/tmp/[Link]","w");
printf("%d\n",getpid());
fprintf(fp,"%d\n",getpid());
fclose(fp);
kill(getpid(),SIGSTOP);
FILE *fpdata=fopen("/tmp/[Link]","r");
fscanf(fpdata,"%d\n",&entier);
printf("Entier lu : %d\n",entier);
return 0;
}

Saisie
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE *fpdata,*fppid;
int entiersaisi;
char strpid[100];
pid_t pidafficheur;
printf("Entrer l'entier demandé\n");
scanf("%d",&entiersaisi);
fpdata=fopen("/tmp/[Link]","w");
fprintf(fpdata,"%d\n",entiersaisi);
fclose(fpdata);
fppid=fopen("/tmp/[Link]","r");
fgets(strpid,100,fppid);
pidafficheur=atoi(strpid);
kill(pidafficheur,SIGCONT);
return 0;
}

Exercice 3

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void handler_arret(int signum)
{
printf("Arrêt du processus en cours\n");
signal(SIGTERM,SIG_DFL);
raise(SIGTERM);
}
int main()
{
pid_t lst_pids_fils[5],pid;
int indice_processus,i;
for(int i=0;i<5;i++)
if((pid=fork())==0)
{
signal(SIGTERM,handler_arret);
while(1)
{
printf("\n pid %d : je tourne",getpid());
sleep(2);
}
}
else
lst_pids_fils[i]=pid;

char choix;
do {
do {
printf("Entrer un choix d'opération\n\ts : pour endormir le fils\n\tr :pour reprendre son exécution\n\tq : pour terminer le fils et quitter\n");
choix=getchar();
fflush(stdin);

}
while((choix!='q') && (choix!='s') && (choix!='r'));
do {
fflush(stdin);
printf("Entrer le numéro du processus à manipuler 0..4\n");
scanf("%d",&indice_processus);
}while(indice_processus>4 || indice_processus<0);
switch( choix)
{
case 'q':
kill(lst_pids_fils[indice_processus],SIGTERM);
lst_pids_fils[indice_processus]=0;
for(i=0;(i<5) && (lst_pids_fils[i]==0) ;i++);
if(i==5)
exit(0);
break;
case 's':
if(lst_pids_fils[indice_processus] !=0)
kill(lst_pids_fils[indice_processus],SIGSTOP);
else
printf("processus déjà mort impossible d'exécuter l'opération\n");
break;
case 'r':
if(lst_pids_fils[indice_processus] !=0)
kill(lst_pids_fils[indice_processus],SIGCONT);
else
printf("processus déjà mort impossible d'exécuter l'opération\n");
break;
default:
break;

}
}
while(1);
return 0;
}
Exercice 4
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int *tab,n,i;
void gestionnaire_erreur_mem(int signum)
{
do
{

printf("Saisir un entier inférieur à %d\n",n);


scanf("%d",&i);
}while ( i<0 || i>n);
printf("tab[%d] = %d\n",i,*(tab+i));
exit(0);
}
int main()
{

do
{
printf("Entrer la taille du tableau");
scanf("%d",&n);
}while(n<=0);
tab=(int *)calloc(n,sizeof(int));
for(i=0;i<n;i++)
{
printf("Entrer la valeur de la case %d\n",i);
scanf("%d",tab+i);
}
do
{
printf("Entrer l'indice à lire");
scanf("%d",&i);
}while(i<0);
signal(SIGSEGV,gestionnaire_erreur_mem);
printf("tab[%d] = %d\n",i,*(tab+i));
}

Vous aimerez peut-être aussi