Vous êtes sur la page 1sur 4

TP n3

Programmation Systme en C sous Linux


Exercice 1
1.
2.
3.
4.
5.
6.

Saisir le programme ci-dessous avec votre diteur de texte prfr.


Avant de le compiler, vrifier l'existence du paquet build-essential
Compiler le programme en gnrant un excutable portant le mme nom avec une extension
diffrente.
Excuter le programme compil. Que remarquez-vous?
Remplacez les if par un switch.
Quelle est la diffrence entre do ...while et while ?
Quel est le rle de wait (NULL) dans ce programme ? commentez la ligne de wait et
sauvegardez. Recompilez prsent et excutez nouveau. Que remarquez-vous ?

/***********************************************************************\
exemple_fork
\***********************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
int main (void)
{
pid_t pid_fils;
do {
pid_fils = fork();
} while ((pid_fils == -1) && (errno == EAGAIN));
if (pid_fils == -1) {
fprintf(stderr, "fork() impossible, errno=%d\n", errno);
return 1;
}
if (pid_fils == 0) {
/* processus fils */
1

fprintf(stdout, "Fils : PID=%ld, PPID=%ld\n",


(long)getpid(), (long)getppid());
return 0;
}
else {
/* processus pre */
fprintf(stdout, "Pere : PID=%ld, PPID=%ld, PID fils=%ld\n",
(long)getpid(), (long)getppid(), (long)pid_fils);
wait(NULL);
return 0;
}
}

Exercice 2
Soit le programme suivant:
#include <stdio.h>
main()
{
int pid;
pid = fork();
if (pid == 0)
{
// for(;;)
printf ("je suis le fils\n");
}
else
{
// for(;;)
printf("je suis le pre\n");
}
}
1.
2.
3.
4.
5.
6.
7.

Compilez ce programme pour gnrer un excutable dont vous prciserez le nom


Lancez lexcution de ce programme.
Dans un autre terminal visualisez les processus qui tournent sur votre systme
Tuez le processus fils
visualisez encore une fois les processus qui tournent. Interprtez
On lance de nouveau lexcution du programme. Tuez le processus pre cette fois
modifiez votre programme en liminant la deuxime boucle for mais en maintenant son
contenu. Ajoutez l'appel systme wait().
8. Recompilez le programme puis lancez son excution. Tuez le processus fils, et visualisez
vos processus. Que constatez vous ?

Exercice n3
1.
2.
3.
4.

Saisir le code ci-dessous l'aide d'un editeur de texte


Compilez-le puis lancez son excution.
Quelle est la valeur de l'UID rel et de l'UID effectif ?
Changez le propritaire du fichier excutable l'aide de la commande chown. Le propritaire
sera maintenant root.
5. Sous l'identit de root, ajoutez le bit Set-UID l'aide de la commande chmod.
L'orsqu 'un utilisateur va maintenant excuter le programme, le systme va lui fournir l'UID
effectif du propritaire du fichier, savoir root (qui a toujours l'UID 0 par dfinition).
6. Visualisez les droits d'accs de votre excutable.Que constatez vous?
7. Lancez l'excution de votre programme une premire fois sous l'identit de root, puis une
deuxime fois sous votre identit. Que constatez-vous?
/***********************************************************************\
exemple_getuid
\***********************************************************************/
#include <stdio.h>
#include <unistd.h>
int
main (void)
{
fprintf(stdout, "UID rel = %u, UID effectif = %u\n",
getuid(), geteuid());
return 0;
}
exercice 4
#include <stdio.h>
int i;
main()
{
int pid;
i = 0;
pid = fork();
if (pid == 0)
{
i = i + 10;
printf ("hello,fils %d\n", i);
3

i = i + 20;
printf ("hello, fils %d\n", i);
}
else
{
i = i + 1000;
printf ("hello, pre %d\n", i);
i = i + 2000;
printf ("hello, pre %d\n", i);
wait();
}
}