Fifos

sparetime Messages postés 34 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 17 août 2004 - 12 août 2004 à 12:00
sparetime Messages postés 34 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 17 août 2004 - 14 août 2004 à 21:24
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

pinderlot Messages postés 59 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 1 septembre 2004 1
12 août 2004 à 16:53
il faut initialiser le flux par une fonction du style fflush(stdout)
-----------------------------------------------
Tout ce qui ne tue pas rend plus fort !
0
sparetime Messages postés 34 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 17 août 2004
14 août 2004 à 21:24
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;


}
0
Rejoignez-nous