C tube Nommé (fifo). Le processus Parent est coincé
Je veux faire un programme simple, qui fourche, et l'enfant écrit dans le canal nommé et le parent qui lit et affiche par le canal nommé.
Le problème est qu'il entre le parent, le premier printf et puis c'est bizarre, il n'a pas faire autre chose, ne pas arriver à la deuxième printf, c'est juste des moyens pour l'entrée dans la console.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void main()
{
char t[100];
mkfifo("myfifo",777);
pid_t pid;
pid = fork();
if (pid==0)
{
//execl("fifo2","fifo2",(char*)0);
char r[100];
printf("scrie2->");
scanf("%s",r);
int fp;
fp = open("myfifo",O_WRONLY);
write(fp,r,99);
close(fp);
printf("exit kid \n");
exit(0);
} else
{
wait(0);
printf("entered parent \n"); //<- this it prints
//whats below this line apparently its not being executed
int fz; printf("1");
fz = open("myfifo",O_RDONLY); printf("2");
printf("fd: %d",fz);
char p[100];
int size;
printf("------");
//struct stat *info;
//stat("myfifo",info); printf("%d",(*info).st_size);
read(fz,p,99);
close(fz);
printf("%s",p);
printf("exit"); exit(0);
}
}
Vous devez vous connecter pour publier un commentaire.
Vous devriez vraiment vérifier la valeur de retour sur les appels de fonction pour les erreurs, en particulier
mkfifo()
etopen()
.Votre appel à
wait()
va causer des problèmes à son emplacement actuel. L'ouverture d'un FIFO pour la lecture bloque normalement jusqu'à ce qu'un autre processus ouvre la même FIFO pour l'écriture, et vice versa1. Le parent est en attente de l'enfant à la fin et de l'enfant est en attente d'un processus de lecteur, c'est à dire, le parent, de se connecter à la FIFO.1 - voir la note sur
open()
ci-dessous pour l'utilisation deO_NONBLOCK
avec une FIFOLe déplacement de la
wait()
appel juste avant que le processus parent quitte avec la modification de la mode dans l'appel àmkfifo()
à0666
semble résoudre certains de vos problèmes immédiats.Il est également conseillé de supprimer le FIFO lorsque vous avez terminé avec elle.
De la
open()
documentation des fonctions de la norme IEEE Std 1003.1-2004:L'exemple suivant est une combinaison de la code dans votre question initiale et la FIFO page de Beej Guide d'Unix à l'IPC:
Cet exemple a été testé sous Linux. Appuyez sur la touche Ctrl-D pour terminer le programme.
Tout d'abord, essayez de fprintf vers stderr au lieu de printf (vers stdout)
Le stderr est sans tampon.
Alors vous pouvez dire ce qui est imprimé et ce qui ne fonctionne pas.
ou au moins ajouter
fflush
avant l'attente de quoi que ce soit.