Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**-------------------------------------------------------------------------
- TP2 - Squelette code exercice 1-V1
- Compilation : gcc tp23_exo1-v1_base.c boucler.o -o tp23_exo1-v1 -Wall
- --------------------------------------------------------------------------**/
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <stdlib.h>
- #include "boucler.h"
- #include <signal.h>
- struct data{
- int id_process;
- int val_immuable;
- int val_incr;
- };
- /*------------------------------------------------------------------------
- Fonction d'affichage d'une erreur selon la cause de l'echec d'une primitive
- Arret du processus avec retour valant codeRetour
- ------------------------------------------------------------------------*/
- void erreur (char *msg, int codeRetour) {
- perror(msg);
- exit(codeRetour);
- }
- /*------------------------------------------------------------------------
- Code execute par chaque processus fils
- ------------------------------------------------------------------------*/
- void fils (/* A compl�ter */) {
- int i=0;
- while(i<5){
- boucler();
- }
- exit(0);
- }
- /*------------------------------------------------------------------------*/
- int main(int argc, char *argv[]) {
- struct data info;
- if (argc !=2){
- perror("argc");
- exit(1);
- }
- int nbrFils=5;
- int debut=0;
- pid_t fils[nbrFils];
- int tube[nbrFils][2];
- for (int i=0;i<nbrFils;i++)
- pipe(tube[i]);
- info.val_immuable= 234;
- info.val_incr=1;
- /* Cr�éation des fils */
- for(int i=0; i<nbrFils; i++ ) {
- fils[i]=fork();
- if (fils[i]==-1) {
- erreur("Echec fork", 1);
- exit(99);
- }
- else if(fils[i]==0){
- int in = tube[(i+1)%nbrFils][1];
- if(i==0){
- int in = tube[0][1];
- }
- int out = tube[i][0];
- //printf("creation tube\n");
- for (int j=0;j<nbrFils;++j){
- if (tube[j][1] != in)
- close(tube[j][1]);
- if (tube[j][0] != out)
- close(tube[j][0]);
- }
- if (i==0 && debut==0){
- printf("Processus de pid %d : n°%d dans l'anneau : j'envoie au n°%d l’info [%d – %d – %d]\n",
- getpid(), i, (i+1)%nbrFils, getpid(), info.val_immuable, info.val_incr);
- debut++;
- info.id_process=getpid();
- write (in, &info,sizeof info);
- close(in);
- }
- if(i!=0){
- read(out, &info, sizeof info);
- info.val_incr++;
- printf("Processus de pid %d : n°%d dans l’anneau : j’ai reçu de %d, j'envoie au n°%d l’info [%d – %d – %d]\n",
- getpid(), i, info.id_process, (i+1)%nbrFils, getpid(), info.val_immuable, info.val_incr);
- close(out);
- info.id_process=getpid();
- write (in, &info,sizeof info);
- close(in);
- printf("Processus de pid %d : je me termine (aussi)\n", getpid());
- exit(0);
- }
- while(read(out, &info, sizeof info)){
- if(info.val_incr==nbrFils){
- printf("Processus de pid %d : l’information m’est revenue de %d, je peux me terminer\n", getpid(), info.id_process );
- exit(0);
- }
- }
- /* default : break; */
- }
- }
- info.id_process=getpid();
- write(tube[0][1], &info , sizeof info);
- /* Attendre �ventuellement la fin de son fils */
- wait(NULL);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement