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