Fifos

Signaler
Messages postés
34
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
17 août 2004
-
Messages postés
34
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
17 août 2004
-
salut
j'ai voulu essayé ce code
/* Processus ecrivain */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

#include <fcntl.h>
#include <string.h>

main()
{mode_t mode;
int tub;
mkfifo ("fictub",0777);

tub = open("fictub",O_WRONLY); /* ouverture fichier */
write (tub,"hello",5); /* ?criture dans fichier */
close (tub);
exit(0);}
/* Processus lecteur */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

#include <fcntl.h>
#include <string.h>

main()
{int tub;
char buf[11];
tub = open("fictub",O_RDONLY); /* ouverture fichier */
read (tub,buf,5); /* lecture du fichier */
buf[6]=0;
printf("Jai lu %s\n", buf);
close (tub);
exit(0); }
mais qd j'exécute sous linux le process lecteur
le deuxieme code j'ai pas le hello qui s'affiche mais du n'importe quoi et je ne sais pas pourquoi
merci de votre aide

2 réponses

Messages postés
59
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
1 septembre 2004

il faut initialiser le flux par une fonction du style fflush(stdout)
-----------------------------------------------
Tout ce qui ne tue pas rend plus fort !
Messages postés
34
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
17 août 2004

ok merci ca a marché pour ce cas mais qd j'ai voulu essayé le meme truc avec un segment de mémoire partagée j'ai eu le meme pb
voici le code:
/* prod.c */

/*
Ce programme lit une suite de nombres, et effectue le cumul da
variable en mémoire partagée. */

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

void abandon(char message[])
{
perror(message);
exit(EXIT_FAILURE);
}

struct donnees {
int nb;
char *message;
};

int main(void)
{
key_t cle;
int id;
struct donnees *commun;
char *reponse;
int cpt;

cle = ftok(getenv("HOME"), 'a');
if (cle == -1)
abandon("ftok");

id = shmget(cle, sizeof(struct donnees),
IPC_CREAT | IPC_EXCL | 0666);

if (id == -1) {
switch (errno) {
case EEXIST:
abandon("Note: le segment existe déjà\n");
default:
abandon("shmget");
}
}
commun = (struct donnees *) shmat(id, NULL, SHM_R | SHM_W);
if (commun == NULL)
abandon("shmat");

commun->nb = 0;
commun->message =NULL;

while (1) {
fflush(stdout);
printf("+ ");
if (scanf("%s", reponse) != 1)
break;
commun->nb++;
commun->message= reponse;
printf("message %d = %s\n", commun->nb,commun->message);

}
printf("---\n");

if (shmdt((char *) commun) == -1)
abandon("shmdt");

/* suppression segment */
if (shmctl(id, IPC_RMID, NULL) == -1)
abandon("shmctl(remove)");

return EXIT_SUCCESS;
}

/* cons.c */

/*
Ce programme affiche périodiquement le contenu de la
mémoire partagée. Arrêt par Contrôle-C
*/

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <signal.h>

#define DELAI 2

void abandon(char message[])
{
perror(message);
exit(EXIT_FAILURE);
}

struct donnees {
int nb;
char *message;
};

int continuer_boucle = 1;

void arreter_boucle(int signal)
{
continuer_boucle = 0;
}

int main(void)
{
key_t cle;
int id;
struct donnees *commun;
struct sigaction a;

cle = ftok(getenv("HOME"), 'a');
if (cle == -1)
abandon("ftok");

id = shmget(cle, sizeof(struct donnees), 0);
if (id == -1) {
switch (errno) {
case ENOENT:
abandon("pas de segment\n");
default:
abandon("shmget");
}
}

commun = (struct donnees *) shmat(id, NULL, SHM_R);
if (commun == NULL)
abandon("shmat");

continuer_boucle = 1;

a.sa_handler = arreter_boucle;
sigemptyset(&a.sa_mask);
a.sa_flags = 0;
sigaction(SIGINT, &a, NULL);

while (continuer_boucle) {
sleep(DELAI);
fflush(stdout);
printf("message %d= %s\n", commun->nb, commun->message);
}

printf("---\n");
if (shmdt((char *) commun) == -1)
abandon("shmdt");

return EXIT_SUCCESS;


}