Skip to content

Programmation Système : TP2 - Processus⚓︎


Sur Papier⚓︎

Exercice 1 : Arbre généalogique⚓︎

On a le code suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>

int main()
{
    int p1,p2,p3;
    p1=p2=p3=-1;
    p1=fork();
    p2=fork();
    p3=fork();
    if(p1==0)
        execv("F1",NULL);
    if(p2==0)
        execv("F2",NULL); 
    if(p3==0)
        execv("F3",NULL);
    pause();
    exit(0);
}
  1. Combien de processus s'executent ?
  2. Sur quels programmes (Père, F1, F2 et F3) ?

Justifiez vos réponses en dessinant un arbre généalogique.

corrtd

Exercice 2 : Lecture de code⚓︎

On suppose que le pid du père est 100 et celui du fils 200, quelles sont les valeurs affichées par le programme ci-dessous ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>

int main(void)
{
    int pid;
    int x = 0;
    x++;
    printf(" mon pid est %d x = %d \n",getpid(),x);
    pid = fork();
    if(pid == 0)
    {
        x++;
        printf(" mon pid est %d x = %d \n", getpid(), x );
    } else
        printf(" mon pid est %d x = %d \n", getpid(), x ); 
    printf(" mon pid est %d x = %d \n", getpid(), x );
}
Solution
1
2
3
4
5
mon pid est 100 x = 1
mon pid est 200 x = 2
mon pid est 200 x = 2
mon pid est 100 x = 1
mon pid est 100 x = 1

L'ordre d'affichage peut chnager selon l'orde de passage de processus ! Cela dépends du timing, de l'algo d'ordonnacement en vigueur etc ...


A coder !⚓︎

Exercice 3 : fork()⚓︎

Dans un même programme, un processus en active un autre et se met en attente de la fin de celui-ci, récupère le mot d’état (valeur retournée par exit()) transmis et l’affiche.

Chacun des processus affiche son PID et celui de son père.
Le père affiche en plus le PID de son fils.

Solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>

int main(void)
{
    int pid;
    int status;

    pid = fork();

    if(pid == 0)
    {
        printf(" FILS : mon pid est %d \n", getpid());
        printf(" FILS : mon ppid est %d \n", getppid());
        exit(10);
    }else{
        printf("PERE : mon pid est %d \n", getpid()); 
        printf("PERE : mon ppid est %d \n", getppid() );
        printf ("PERE: mon fils est %d", pid); 
        wait(&status);
        printf("\n PERE status :  %d",status>>8);
    }

return 0;
}

Exercice 4 : execv()⚓︎

Un processus (programme P) en active un autre F en lui transmettant une chaine de caractères saisie au clavier.

  • F calcule la longueur de la chaine et la transmet comme mot d’état à P.
  • P affiche la longueur.
Solution

Père :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>

int main(void)
{
    int pid;
    int stat;
    char message [100];
    int longueur;
    char * argv [3];
    argv[0] = "F";
    argv[2]= NULL;

    printf("Entrez une chaine de caractere : ");
    scanf("%s",message);
    pid = fork();
    argv[1]= message;

    if(pid == 0)
    {
        printf(" FILS : mon pid est %d \n", getpid());
        printf(" FILS : mon ppid est %d \n", getppid());
        execv("F",argv);
    }else{
        printf("PERE : mon pid est %d \n", getpid()); 
        printf("PERE : mon ppid est %d \n", getppid() );
        printf ("PERE: mon fils est %d", pid); 
        wait(&stat);
        printf("\n PERE status == longueur message :  %d",stat>>8);
    }

return 0;
}

Fils :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>

int main(int argc,char *argv[])
{
    int cpt = 0;
    char * mess;
    mess = argv[1];
    while (mess[cpt] != '\0'){
        cpt ++;
    }
    printf("FILS : La chaine fait %d \n ", cpt);

  exit(cpt);
}