Vous êtes sur la page 1sur 5

TP N°2

INTRODUCTION:

Ces trois exercices permettent d'analyser le fonctionnement des tubes;

Les tubes sont un mecanisme de communication qui permet de realiser des communications entre
processus sous forme d’un flot continu d’octets. Un tube est materialise par deux entrees de la table
des ouvertures de fichiers,associees `a une inode en memoire geree

par un driver specifique. Une entr´ee est utilisee par les processus qui ´ecrivent dans le tube, une
entree pour les lecteurs du tube.

*************************************************************************************
********

EXERCICE 1:

#include<unistd.h>

#include<stdlib.h>

#include<sys/types.h>

#include<wait.h>

int main() {

pid_t p1,p2;

char Buffer[100];

int fd[ 2 ];

pipe(fd);

p1=fork();

if(p1 == -1 || fd[0] == -1 ) printf( " error p1 ");

else { close( fd[1] );

read( fd[1] ,Buffer ,7);

close ( fd [0] );

printf( " message recu est :%s \n" , Buffer);

exit(0); }
p2=fork();

if( p2== -1 ) printf("error p2");

else if( p2==0 ) {

close ( fd[0] );

cprintf( Buffer, " Bonjouuur" );

write ( fd[1] , "Bonjouuur",strlen ( Buffer ) );

close( fd[1] );

exit(1);

//affichage de terminison des processus ensfants

waitpid( pid, NULL );

waitpid( pid, NULL );

return (0);

*************************************************************************************
********

EXERCICE 2:

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<string.h>

#include <ctype.h>

int main() {

int fd[ 2 ];

pid_t p1,p2;
char message[100] ="heey there \n";

int len=strlen(message);

// crée le pipe

pipe(fd);

p1,p2=fork();

if( fork() > 0 ) { close( fd[0] );

write( fd[1] , " heey there ", len );

close( fd[1] ); }

else { close ( fd[1] );

read( fd[0] , message , 7 );

close( fd[0] ); }

if( p1==0 ){ // premier processus

char *lower = calloc(len+1, sizeof(char));

for (int i = 0; i < len ; i++) {

lower[i] = tolower((unsigned char)message[i] ) ; }

/* Affiche la chaine ainsi convertie */

printf("%s", lower);

else if( p2==0 ){ //deuxieme processus

char *upper = calloc(len+1, sizeof(char));

for (int i = 0; i < len ; i++) {

upper[i] = toupper((unsigned char)message[i] ) }

/* Affiche la chaine ainsi convertie */

printf("%s", upper);
}

return 0;

*************************************************************************************
*******

EXERCICE 3:

#include<stdio.h>

#include<unistd.h>

#include<signal.h>

void handle_signal ( int signal ) { printf( " signal %d.\n ", signal ) ;}

int main( ) {

pid_t p1,p2=fork();

while ( p1==-1 || p2==-1 ) { printf( " error de creation ") ; }

if ( p1 >0 ) { //processus parent

printf( " L 'envoi du signal SIGTREM aux processus fils " );

Kill( p1, SIGTREM );

sleep( 5 ); }

else if ( p2==0 ) { signal( SIGTREM, handle_signal );

printf ( " Signal SIGTREM reçu " ) ;

printf( " terminaison de processus fils 2" );

sleep(10);

printf(" Terminaison du processus parent \n");


}

return 0;

*************************************************************************************
*********

CONCLUSION:

Les resultas de ces exercices montrent que Un tube de communication, ou pipe en anglais, permet de
faire communiquer 2 commandes.

Le résultat de la commande de gauche est envoyé dans le tube et récupéré par la commande de
droite.

C'est à dirte que la sortie standard "1" de la commande de gauche est connecté directement à l'entrée
standard "0" de la commande de droite.

Vous aimerez peut-être aussi