Tableau
moimeme
-
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
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:
- Tableau
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Imprimer un tableau excel - Guide
- Tableau croisé dynamique - Guide
3 réponses
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?
Le programme n'affiche rien, mais est-ce qu'il(s) plante(nt) ?
Les programmes sont lancés à la main?
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:
programme qui renvoie les lettres (fils)
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
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
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.
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);
}