Tableau

moimeme -  
 moimeme -
Bonjour,
J'ai un problème, je pense avec les tableau.

J'ai 2 programmes qui communiquent à travers un pipe. Le 1er programme envoie un élément d'un tableau de caractères au 2nd programme qui doit les afficher.
mon programme compile mais n'affiche rien...

si vous pouviez jeter un oeuil à la syntaxe de la zone ou je pense qu'il y a une erreur ?

1er prog

char tab[10];
...
p1=open("pipe",O_WRONLY);
int j=0;
write(p1,&tab[j],sizeof(tab));
usleep(800);
close(p1);

2nd programme

char tab[10];
...
int j=0;
read(p1,&tab[j],sizeof(tab));
printf("la lettre est %c\n",tab[j]);
usleep(500);
close(p1);

merci d'avance
A voir également:

3 réponses

loupius
 
Donne le code des 2 programmes, cela ne doit être très long; et surtout n'oublie pas la balise <code> (tu peux vérifier en faisant 'Prévisualiser')
Le programme n'affiche rien, mais est-ce qu'il(s) plante(nt) ?
Les programmes sont lancés à la main?
0
moimeme
 
le programme est plutot long (en fait j'ai posé un question hier sur la synchronisation père/fils, et je crois que c'est vous qui m'avez répondu)

le programme se termine normalement, il ne reste pas blouqé, il n'affiche pas le résultat c'est tout.

programme qui recoit (pere) (en fait le pere envoie un message au fils par un pipe. Le fils renvoie la 1ere lettre par l pipe au père:
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<signal.h>

void erreur(char *mes);
char tab[10];

int main(void)
{
	int pidb,pidc,p1;
	int bip=0;
	char car[10];	

	// creation du pipe
	unlink("pipe");
	mkfifo("pipe",0666);

	// creation des 2 fils
	pidb=fork();
	if (pidb==0) execv("bob",NULL);
	//pidc=fork();
	//if (pidc==0) execv("charles",NULL);
	
	//ouverture d'un pipe en ecriture
	p1=open("pipe",O_WRONLY);
	if (p1==-1) erreur("pb d'ouverture en ecriture");

		
	printf("\ntaper une sequences de caracteres\n");
	scanf("%s",car);
	// lecture des caracteres
	int i=0;
	while(car[i]!='\0') // pas de &car[i]	
	{
		
		// tri+envoi d'un signal au fils approprié
		usleep(500);
		if (car[i]>='A' && car[i]<='z')
		kill(pidb,SIGUSR1);

		//else if (car[i]>='1' && car[i]<='9')
		//kill(pidc,SIGUSR1);
	
		else
		{
			printf("caractere non valide\n");
			bip=1; // on n'ecrit rien dans le pipe
		}

		// écriture dans le pipe
		if (bip==0) write(p1,&car[i],sizeof(car));

		i++;

	}

	//on referme le pipe en écriture
	usleep(500);
	close(p1);

	// on envoie le message de fin de l'ecriture
	printf("\nhiiiiiiiiiiiiiiiiii\n");	
	kill(pidb,SIGUSR2);	

	

	// on ouvre le pipe en lecture
	p1=open("pipe",O_RDONLY);
	if (p1==-1) erreur("pb d'ouverture en lecture");

	//on lit
	int j=0;
	//for(j=0;j=10;j++)
	//{
		read(p1,&tab[j],sizeof(tab));
		printf("la lettre est %c\n",tab[j]);
		printf("%s\n",&tab[j]);
	//}

	//on referme le pipe en lecture
	usleep(500);
	close(p1);

	// on tue les processus
	kill(pidb,SIGKILL); 
	kill(pidc,SIGKILL);

	return(0);
}


void erreur(char *mes)
{
	printf("%s\n",mes);
	exit(-1);
}


programme qui renvoie les lettres (fils)

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

void erreur(char *mes);
void lect(int sig);
void envoyer();

// s'occupe des lettres

int p1;
int i=0;
char tab[10];

int main(void)
{

	
	//ouverture d'un pipe en lecture
	p1=open("pipe",O_RDONLY);
	if (p1==-1) erreur("pb d'ouverture en lecture\n");

	// on se prepare au signal
	signal(SIGUSR1,lect);
	signal(SIGUSR2,envoyer); // signal de fin	

	// on attend le signal
	for(;;)
	{
		pause();
	}
	
	exit(0);
}

void lect(int sig)
{
	char lett;
	
	// lecture du pipe
	read(p1,&tab[i],sizeof(lett));
	//on stocke la variable ds un tableau
	//tab[i]=lett; /////////////////////////// erreur ??????????????????????????????????

	// on affiche le resultat
	printf("la lettre lue est %c  i=%d\n", tab[i], i);
		i++;


}

void envoyer()
{
	//on referme le pipe
printf("\nturlututu\n");
	close(p1);
	//tab
	//on ouvre le pipe en écriture cette fois ci
	p1=open("pipe",O_WRONLY);
	int j=0;
	//while(tab[j]!='80');
	//{
		write(p1,&tab[j],sizeof(tab));
		
		usleep(800);
	//}
	close(p1);
}


void erreur(char *mes)
{
	printf("%s\n",mes);
	exit(-1);
}





PS: je n'ai pas utilisé sigaction, amsi signal, car j'avais des erreurs que je n'arrivais pas a corriger avec sigaction, mais a priori, signal marche pusique le fils recoit bien tous les messages
0
loupius
 
Tu n'étais pas loin de la solution.
J'ai débarrassé le programe de tout ce qui était inutile et ai ajouté des 'printf' pour pouvoir suivre le déroulement.
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<signal.h>

void erreur(char *mes)
{
	printf("%s\n", mes);
	exit(-1);
}

int main(void)
{
	int pidb, p1;
	char car[10];	

	// creation du pipe
	unlink("pipe");
	mkfifo("pipe",0666);

	// creation des 2 fils
	pidb = fork();
	if (pidb == 0)
		execv("bob",NULL);
	// ouverture d'un pipe en ecriture
	p1=open("pipe",O_WRONLY);
	if (p1 == -1)
		erreur("Pere: Pb d'ouverture en ecriture");

	printf("\nPere: Entrez une sequence de caracteres (max 9)\n");
	scanf("%s", car);
	// lecture des caracteres
	int i = 0;
	while (car[i] != '\0') // pas de &car[i]
	{
		if (car[i]>='A' && car[i]<='z')	// tri+envoi d'un signal au fils approprié
		{
			usleep(500);
			kill(pidb, SIGUSR1);
			write(p1, &car[i], 1);
		}
		else
			printf("Pere: caractere non valide\n");
		i++;
	}
	close(p1);	//on referme le pipe en écriture
	printf("\nPere: Fin ecriture - Debut lecture\n");	
	kill(pidb, SIGUSR2);	
	p1 = open("pipe", O_RDONLY);	// on ouvre le pipe en lecture
	if (p1 == -1)
		erreur("Pere: pb d'ouverture en lecture");

	char caract;
	int k=0;
	do	//on lit
	{
		read(p1, &caract, 1);
		printf("Pere: la lettre est %c - %X\n", caract, caract);
	}
	while (caract && ++k<1000);
	close(p1);	//on referme le pipe en lecture

	kill(pidb, SIGKILL); 	// on tue le processus fils

	return(0);
}

#include<wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<signal.h>

void erreur(char *mes);
void lect(int sig);
void envoyer();

// s'occupe des lettres

int p1;
int i = 0;
char tab[10];

int main(void)
{
	p1=open("pipe", O_RDONLY);	//ouverture d'un pipe en lecture
	if (p1 == -1)
		erreur("Fils: pb d'ouverture en lecture\n");
	// on se prepare au signal
	signal(SIGUSR1, lect);
	signal(SIGUSR2, envoyer); // signal de fin	

	for(;;)
		pause();	// on attend le signal
	exit(0);
}

void lect(int sig)
{
	printf ("Fils: lecture()\n");
	read(p1, &tab[i], 1);	// lecture du pipe et stockage dans le tableau
	printf("fils: la lettre lue est %c  i=%d\n", tab[i], i);
	i++;
}

void envoyer()
{
	printf("\nFils: envoyer() %i caract\n", i);
	close(p1);	//on referme le pipe
	p1=open("pipe",O_WRONLY);	//on ouvre le pipe en écriture cette fois ci
	write(p1, tab, i);
	tab[0] = 0;
	write(p1, tab, 1);	// Envoi d'un caractère nul de fin d'envoi
	close(p1);
	printf("\nFils: fin envoyer()\n");
}

void erreur(char *mes)
{
	printf("%s\n",mes);
	exit(-1);
}
0
moimeme
 
merci beaucoup loupius !
0