Problème de programmation en C

Fermé
Laurent - 17 nov. 2004 à 11:56
 fourou - 17 nov. 2004 à 13:49
Bonjour,

J'ai programmé un programme C qui utilise plusieurs processus.
Un des processus tourne en continue (boucle for(;;) ) et à chaque tour de boucle reste en attente d'un signal USR1 avant de continuer la boucle. Mon problème est le suivant : A la reception d'un premier signal tout se passe bien et le processus retourne en attente et à la reception d'un second signal le processus devient zombie !

Quelqu'un a t il une idée ? Je peux bien sur envoyé mon code à qui en fera la demande...

Merci d'avance,

Laurent

1 réponse

maily Messages postés 7556 Date d'inscription lundi 26 juin 2000 Statut Contributeur Dernière intervention 23 juin 2023 453
17 nov. 2004 à 12:12
Bonjour!!

Je pense que en effet, le code de la boucle est nécessaire pour qu'une aide arrive!
;-)

Maily :-))))
Boumj'chtattrape
0
Merci pour ta réponse !

Voilà le processus qui pose problème (il est un peu long, désolé...) :

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <signal.h>
#include "types.h"

#define LECTURE 0
#define ECRITURE 1

int signe10; /* Variable positive sur reception d'un signal d'un terminal */
int signe12; /* Variable positive sur reception d'un signal du reseau interbancaire */

void TraiteSignal(int sig) { /* Fonction de traitement des signaux */

if (sig == 10) { /* Reception d'un signal d'un terminal */
signe10++;
}

if (sig == 12) {/* Reception d'un signal du reseau interbancaire*/
signe12++;
}
}

int main(int argc,char* argv[]) {

struct sigaction act;
FILE* ecriture_autorisation;
FILE* lecture_autorisation;
FILE* lecture_terminal;
FILE* ecriture_terminal;
FILE* ecriture_ib;
FILE* lecture_ib;
char* reponse_terminal = (char*)malloc(50*sizeof(char));
char* demande_terminal = (char*)malloc(50*sizeof(char));
char rep_aut[50];
char ib_r[50];
char code_banque_client[3];
char code_banque_serveur[3];
message M;
message N;
message T;
int tuyau_lecture_autorisation;
int tuyau_ecriture_autorisation;
int tuyau_lecture_terminal;
int tuyau_ecriture_terminal;
int tuyau_lecture_ib;
int tuyau_ecriture_ib;
int pid_terminal;
int pid_ib;
int serveur_origine;

/* Initialisation du traitement des signaux */
act.sa_handler = TraiteSignal;
sigemptyset(&act.sa_mask);
sigaction(SIGUSR1,&act,NULL);
sigaction(SIGUSR2,&act,NULL);

/* Recuperation des arguments */
strcpy(code_banque_serveur,argv[1]);
tuyau_lecture_autorisation = atoi(argv[2]);
tuyau_ecriture_autorisation = atoi(argv[3]);
tuyau_lecture_terminal = atoi(argv[4]);
tuyau_ecriture_terminal = atoi(argv[5]);
pid_ib = atoi(argv[6]);
tuyau_ecriture_ib = atoi(argv[7]);
tuyau_lecture_ib = atoi(argv[8]);

/* Ouverture des fichiers */
ecriture_autorisation = fdopen(tuyau_ecriture_autorisation,"w");
lecture_autorisation = fdopen(tuyau_lecture_autorisation,"r");
ecriture_terminal = fdopen(tuyau_ecriture_terminal,"w");
lecture_terminal = fdopen(tuyau_lecture_terminal,"r");
ecriture_ib = fdopen(tuyau_ecriture_ib,"w");
lecture_ib = fdopen(tuyau_lecture_ib,"r");

/* Initialisation des variables */
signe10 = 0 ;
signe12 = 0 ;

/* Deroulement du processus */
for(;;) {
sigset_t sigmask;

/* En attente d'un signal */
while (signe10==0&&signe12==0) {
sigemptyset(&sigmask);
sigsuspend(&sigmask);
}

/* Sur reception d'une demande du terminal */
if (signe10 > 0) {
fgets(demande_terminal,255,lecture_terminal);
M=decodage(demande_terminal,1);
pid_terminal = atoi(M.numero_terminal);
strncpy(code_banque_client,M.numero_carte,4);
if (atoi(code_banque_serveur)==atoi(code_banque_client)) {
/* Le titulaire de la carte est de la meme banque que le serveur */
/* Envoi de la demande au serveur d'autorisation */
fprintf(ecriture_autorisation,codage(M,3));
fflush(ecriture_autorisation);
/* Reception de la reponse du serveur d'autorisation */
fgets(rep_aut,50,lecture_autorisation);
/* Formatage de la reponse pour le terminal */
reponse_terminal = codage(decodage(rep_aut,3),1);
/* Envoi de la reponse au terminal */
kill(pid_terminal,SIGUSR1);
fprintf(ecriture_terminal,reponse_terminal);
fflush(ecriture_terminal);
}
else {
/* Le titulaire de la carte n'est pas de la meme banque que le serveur */
/* Envoi de la demande au reseau interbancaire */
sprintf(M.numero_identifiant,"%d",getpid());
if (kill(pid_ib,SIGUSR2) == 0) {
fprintf(ecriture_ib,codage(M,2));
fflush(ecriture_ib);
}
}
signe10--;
}

/* Sur réception d'un signal du reseau interbancaire */
if (signe12 > 0) {
fscanf(lecture_ib,"%s",ib_r);
N=decodage(ib_r,2);
serveur_origine=atoi(N.numero_identifiant);
if (N.IO == 'R') /* C'est une reponse a une demande */ {
/* Formatage de la reponse pour le terminal */
reponse_terminal = codage(N,1);
/* Envoi de la reponse au terminal */
pid_terminal = atoi(N.numero_terminal);
kill(pid_terminal,SIGUSR1);
fprintf(ecriture_terminal,reponse_terminal);;
fflush(ecriture_terminal);
}
else { /* C'est une demande */
/* Envoi de la demande au serveur d'autorisation */
fprintf(ecriture_autorisation,codage(N,3));
fflush(ecriture_autorisation);
/* Reception de la reponse du serveur d'autorisation */
fgets(rep_aut,50,lecture_autorisation);
/* Formatage de la reponse pour le reseau interbancaire */
T=decodage(rep_aut,3);
T.numero_identifiant = (char*)malloc(10*sizeof(char));
sprintf(T.numero_identifiant,"%d",serveur_origine);
reponse_terminal = codage(T,2);
/* Envoi de la reponse au reseau interbancaire */
if (kill(pid_ib,SIGUSR2) == 0) {
fprintf(ecriture_ib,reponse_terminal);
fflush(ecriture_ib);
}
}
signe12--;
}
}
exit(EXIT_SUCCESS);
}

Merci d'avance !!
0
c à kel moment que tes signe10 et signe12 s'incrémentent?
0