IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

processus - tube


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 12
    Points
    12
    Par défaut processus - tube
    Bonjour les amis,, j'ai besoin de votre avis sur un programme que j'ai realisé qui traite le prb suivant:
    Un processus (père) P0 lit dans un fichier un texte de plusieurs dizaines de caractères.Il le segmente en paquets de 8 caractères et numérote chaque paquet.Au fur et à mesure que les paquets sont constitués, le père transmet par tubes le paquet à l’un de ses 3 fils P1, P2, P3 choisi aléatoirement. Chacun de ses fils traite un paquet reçu en le retenant aléatoirement entre 1 et 4 secondes, puis le transmet à P4 par tube.P4 réordonne les paquets reçus et affiche le message lorsque tous les paquets ont été reçus.

    le code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    #include <unistd.h>
    #include <sys/type.h>
    #include <sys/wait.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
     
    /******************FONCTION RETARD***************/
    void retard(void);
    void retard(void)
    switch((rand()%4)+1)
    {
    case 1: sleep(1);
    case 2: sleep(2);
    case 3: sleep(3);
    case 4: sleep(4);
    }
     
    void Recep_pro(int t1, int t2, int t3, char pk);
    void Recep_pro(int t1, int t2, int t3, char pk)
    {
       close(t2[0]);
       close(t2[1]);
       close(t3[0]);
       close(t3[1]);
       read(t1[0],pk,10);
    }
     
    void Recep_p4(char pke, int t4);
    void Recep_p4(char pke, int t4)
    {
    read(t4[0],pke,10);
     
    }
     
    /****************Corps Principal********************************/
     
    int main(int argc, char *argv[])
    {
    pid_t proc_pid[3];   /* PID des processus*/
    int i,n,fi;
    int c1, c2, c3, c4;
    int tubeE1[2],tubeE2[2],tubeE3[2],tubeE4[2]; /*tube d'emission*/
    int tubeR[2]; /*tube de reception*/
    char paquetE[9], paquetR[9], paquet[9];
    char template[] = "/tmp/fileXXXXXX";
     
     
    FILE *fichier
     
    pipe(tube1E); /*******************************************/
    pipe(tube2E); /*    Creation des tubes d'emission       	*/
    pipe(tube3E); /*******************************************/
     
    pipe(tube1R); /*******************************************/
    pipe(tube2R); /*    Creation des tubes de reception     	*/
    pipe(tube3R); /*******************************************/
    
     
    fichier=open("text.txt","r");
     
    while(feof(fichier)==0)
    {
       fgets(paquet+1,8,fichier);
       i=1;
       strcpy(paquet,i);
       i++;
       r=(rand()%3)+1;
       switch(r)
       {
       case 1:
       write(tube1E[1],paquet,8);
       kill(proc_pid[0], SIGSUR1);
       case 2:
       write(tube2E[1],paquet,8);
       kill(proc_pid[1], SIGSUR1);
       case 3:
       write(tube3E[1],paquet,8);
       kill(proc_pid[2], SIGSUR1);
       }
     
       if(c1=0)
       {
       proc_pid[0]=fork();
       c1=1;
       }
     
       switch(proc_pid[0])
       {
       case -1:
       fprintf(stderr,"Echec de creation de P1");
       return EXIT_FAILURE;
       break;
     
    	case 0:
       signal(SIGSUR1, Recep_pro(tube1E,tube2E,tube3E,paquetR));
       retard();
       write(tubeR[1],paquetR,9);
       break;
     
       default:
    		if(c2=0)
           {
           proc_pid[1]=fork();
           c2=1;
           }
          switch(proc_pid[1]);
    		{
       	case -1:
       	fprintf(stderr,"Echec de creation de P2");
          return EXIT_FAILURE;
     
    		case 0:
       	signal(SIGSUR1, Recep_pro(tubeE2,tubeE1,tubeE3,paquetR));
       	r=retard();
     
       	write(tubeR[1],paquetR,9);
     
    	   default:
       		if(c3=0)
           	{
           		proc_pid[2]=fork();
           		c3=1;
           	}
          	switch(proc_pid[2]);
    			{
       		case -1:
       		fprintf(stderr,"Echec de creation de P3");
             return EXIT_FAILURE;
     
    			case 0:
       		signal(SIGSUR1, Recep_pro(tubeE3,tubeE1,tubeE2,paquetR));
       		retard();
             write(tubeR[1],paquetR,9);
     
             default:
             	if(c3=0)
           		{
           		proc_pid[3]=fork();
           		c4=1;
           		}
          		switch(proc_pid[3]);
    				{
       			case -1:
       			fprintf(stderr,"Echec de creation de P3");
             	return EXIT_FAILURE;
     
    				case 0:
                read(t4[0],packetE,9);
                fi= mkstemp(template);
                n=packetE[0];
                lseek(fi,(n-1), SEEK_SET);
                write(fi,packetE+1,8);
                } /*P4*/
     
               } /*P3*/
          } /*P2*/
       }   /*P1*/
     
    }

  2. #2
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    et ta question est... ?

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    ben j'ai pas de question,, j'ai proposé un code pour resoudre le prob mentionné ci-dessus, et j'aime bien avoir vos remarque dessus,, parceque je n'arrive par a le compiler pour voir si ca marche ou pas,,et merci vous

  4. #4
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par mic68hc11 Voir le message
    parceque je n'arrive par a le compiler pour voir si ca marche ou pas,,et merci vous
    ok, donc tu n'arrive pas a le compiler, peux tu nous donner les erreurs de compilation ?

  5. #5
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    je vois deja une erreur au niveau de la fonction retard:

    tu la declare ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void retard(void)
    switch((rand()%4)+1)
    {
      case 1: sleep(1);
      case 2: sleep(2);
      case 3: sleep(3);
      case 4: sleep(4);
    }
    essaye plutot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void retard(void){
      switch((rand()%4)+1)
      {
        case 1: sleep(1);
        case 2: sleep(2);
        case 3: sleep(3);
        case 4: sleep(4);
      }
    }
    tu as oublié les accolades.

    au niveau de Recep_pro:
    recep pro recupere en argument des int, mais tu les utilise comme des tableau...
    change donc son prototype en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Recep_pro(int * t1, int * t2, int * t3, char * pk)
    et indente un peut mieu ton code, ce sera plus lisible pour nous...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       if(c1=0)
       {
       proc_pid[0]=fork();
       c1=1;
       }
    pour tester une égalité en C, c'est plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       if(c1==0)
       {
       proc_pid[0]=fork();
       c1=1;
       }

  7. #7
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    de meme pour Recep_p4
    change:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Recep_p4(char pke, int t4);
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Recep_p4(char * pke, int * t4)

    quand tu passe un tableau en argument a une fonction, c'est l'adresse du premier element que tu passe, il faut donc le conciderer comme un pointeur...

    il faudrait que tu revoi les notion de pointeurs... et de C en general.

    je voi aussi un oublie de ";" apres FILE *fichier dans le main

    tu declare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int tubeE1[2],tubeE2[2],tubeE3[2],tubeE4[2];
    mais tu utilise tube1E,tube2E ,tube3E,tube4E...


    tu utilise tube1R tube2R tube3R que tu ne declare jamais...
    tu devrai relire ton code plus attentivement, ce sont essentielement des erreurs d'inattention...

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    merci mes amis pour vos remarques,, y avais beaucoup d'erreurs,,, mais c'est plus que moi, j'ai realisé ce code en 1 heure à 03h00 de mat,,dans tous les cas je vous remercie,, et voila le nouveau code modifié,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    #include <unistd.h>
    #include <sys/type.h>
    #include <sys/wait.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
     
    /******************FONCTION RETARD***************/
    void retard(void);
    void retard(void)
    switch((rand()%4)+1)
    {
    case 1: sleep(1);
    case 2: sleep(2);
    case 3: sleep(3);
    case 4: sleep(4);
    }
     
    void Recep_pro(int *t1, int *t2, int *t3, char *pk);
    void Recep_pro(int *t1, int *t2, int *t3, char *pk)
    {
       close(t2[0]);
       close(t2[1]);
       close(t3[0]);
       close(t3[1]);
       read(t1[0],pk,10);
    }
     
    /****************Corps Principal********************************/
     
    int main(int argc, char *argv[])
    {
    pid_t proc_pid[3];   /* PID des processus*/
    int i,n,fi;
    int c1, c2, c3, c4;
    int tube1E[2],tube2E[2],tube3E[2],tube4E[2]; /*tube d'emission*/
    int tubeR[2]; /*tube de reception*/
    char paquetE[9], paquetR[9], paquet[9];
    char template[] = "/tmp/fileXXXXXX";
     
     
    FILE *fichier ;
     
    pipe(tube1E); /*******************************************/
    pipe(tube2E); /*    Creation des tubes d'emission       	*/
    pipe(tube3E); /*******************************************/
     
    pipe(tubeR); /*    Creation des tubes de reception     	*/
     
    fichier=open("text.txt","r");
     
    while(feof(fichier)==0)
    {
       fgets(paquet+1,8,fichier);
       i=1;
       strcpy(paquet,i);
       i++;
       r=(rand()%3)+1;
       switch(r)
       {
       case 1:
       write(tube1E[1],paquet,8);
       kill(proc_pid[0], SIGSUR1);
       case 2:
       write(tube2E[1],paquet,8);
       kill(proc_pid[1], SIGSUR1);
       case 3:
       write(tube3E[1],paquet,8);
       kill(proc_pid[2], SIGSUR1);
       }
     
       if(c1==0)
       {
       proc_pid[0]=fork();
       c1=1;
       }
     
       switch(proc_pid[0])
       {
       case -1:
       fprintf(stderr,"Echec de creation de P1");
       return EXIT_FAILURE;
       break;
     
    	case 0:
       signal(SIGSUR1, Recep_pro(tube1E,tube2E,tube3E,paquetR));
       retard();
       write(tubeR[1],paquetR,9);
       break;
     
       default:
    		if(c2==0)
           {
           proc_pid[1]=fork();
           c2=1;
           }
          switch(proc_pid[1]);
    		{
       	case -1:
       	fprintf(stderr,"Echec de creation de P2");
          return EXIT_FAILURE;
     
    		case 0:
       	signal(SIGSUR1, Recep_pro(tubeE2,tubeE1,tubeE3,paquetR));
       	r=retard();
     
       	write(tubeR[1],paquetR,9);
     
    	   default:
       		if(c3==0)
           	{
           		proc_pid[2]=fork();
           		c3=1;
           	}
          	switch(proc_pid[2]);
    			{
       		case -1:
       		fprintf(stderr,"Echec de creation de P3");
             return EXIT_FAILURE;
     
    			case 0:
       		signal(SIGSUR1, Recep_pro(tubeE3,tubeE1,tubeE2,paquetR));
       		retard();
             write(tubeR[1],paquetR,9);
     
             default:
             	if(c4==0)
           		{
           		proc_pid[3]=fork();
           		c4=1;
           		}
          		switch(proc_pid[3]);
    				{
       			case -1:
       			fprintf(stderr,"Echec de creation de P3");
             	return EXIT_FAILURE;
     
    				case 0:
                read(t4[0],packetE,9);
                fi= mkstemp(template);
                n=packetE[0];
                lseek(fi,(n-1), SEEK_SET);
                write(fi,packetE+1,8);
                } /*P4*/
     
               } /*P3*/
          } /*P2*/
       }   /*P1*/
     
    }

  9. #9
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    si tu veux que les gens aient envie de t'aider, fais l'effort d'indenter ton code.
    ca rend le code plus lisible.
    un code mal indenté n'est pas lisible, et ne donne pas envie d'aider !

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/10/2011, 21h12
  2. Tubes et processus fils
    Par Jopzeut dans le forum Linux
    Réponses: 3
    Dernier message: 18/03/2011, 18h03
  3. Réponses: 4
    Dernier message: 13/10/2009, 15h05
  4. Processus externe et tubes
    Par vinzzzz dans le forum C
    Réponses: 9
    Dernier message: 27/01/2009, 08h25
  5. Utilisation de processus et de tubes
    Par al85 dans le forum Linux
    Réponses: 2
    Dernier message: 05/12/2004, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo