Les deux sens de la Communication Parent-Enfant à l'Aide de 2 Tuyaux en C sous Linux
Je suis en train de créer une communication à deux voies entre le parent et l'enfant, les processus à l'aide de 2 tuyaux à l'aide de C sur Linux. Le parent est mon programme et que l'enfant est juste un hasard de programme (dire "chat").
J'essaie de utilise read()
parents à lire à l'enfant de sortie, mais il me donne errno 9, ce qui est Mauvais descripteur de fichier.
Voici mon code
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#define Read 0
#define Write 1
#define ParentRead read_pipe[1]
#define ParentWrite write_pipe[0]
#define ChildRead write_pipe[1]
#define ChildWrite read_pipe[0]
int main()
{
int data_processed;
/** Pipe for reading for subprocess */
int read_pipe[2];
/** Pipe for writing to subprocess */
int write_pipe[2];
char buffer[100];
memset(buffer, '#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#define Read 0
#define Write 1
#define ParentRead read_pipe[1]
#define ParentWrite write_pipe[0]
#define ChildRead write_pipe[1]
#define ChildWrite read_pipe[0]
int main()
{
int data_processed;
/** Pipe for reading for subprocess */
int read_pipe[2];
/** Pipe for writing to subprocess */
int write_pipe[2];
char buffer[100];
memset(buffer, '\0', 100);
if (pipe(read_pipe) == 0 && pipe(write_pipe) == 0)
{
pid_t pid = fork();
if (pid == (pid_t)-1)
{
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
else if (pid == (pid_t)0) //Child process
{
close(Read);
close(Write);
close(ParentRead);
close(ParentWrite);
dup(ChildRead);
dup(ChildWrite);
execlp("cat", (char*)NULL);
exit(EXIT_FAILURE);
}
else { //Parent process
close(ChildRead);
close(ChildWrite);
write(ParentWrite, "abc", 3);
int r = read(ParentRead, buffer, 99);
printf("%d %d", r, errno);
puts(buffer);
}
}
exit(EXIT_SUCCESS);
}
', 100);
if (pipe(read_pipe) == 0 && pipe(write_pipe) == 0)
{
pid_t pid = fork();
if (pid == (pid_t)-1)
{
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
else if (pid == (pid_t)0) //Child process
{
close(Read);
close(Write);
close(ParentRead);
close(ParentWrite);
dup(ChildRead);
dup(ChildWrite);
execlp("cat", (char*)NULL);
exit(EXIT_FAILURE);
}
else { //Parent process
close(ChildRead);
close(ChildWrite);
write(ParentWrite, "abc", 3);
int r = read(ParentRead, buffer, 99);
printf("%d %d", r, errno);
puts(buffer);
}
}
exit(EXIT_SUCCESS);
}
open( ) les tuyaux avant de faire des I/O.
N'est-ce pas (pipe(read_pipe) == 0 && pipe(write_pipe) == 0) même chose que l'ouverture des tuyaux?
Oui, c'est la même chose.
N'est-ce pas (pipe(read_pipe) == 0 && pipe(write_pipe) == 0) même chose que l'ouverture des tuyaux?
Oui, c'est la même chose.
OriginalL'auteur Jeff | 2012-02-16
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez rediriger l'entrée standard stdin et stdout pour les tuyaux, vous devez utiliser dup2(2) de l'appel système.
P. S.
J'ai aussi trouvé de fausses directions de la lecture/écriture dans les tuyaux. Ici est la bonne façon
Rappelez-vous: tube[0] fd pour la lecture, la conduite[1] est fd pour l'écriture.
Et encore une erreur, execlp. Ne pas oublier de mettre le premier argument que vous envoyez à l'exécution du programme, comme le nom du programme
J'ai trouvé encore une erreur que j'ai décrit dans la réponse.
Comment ai-je pu être si négligent. J'ai même vérifié quand j'ai écrit le programme. Je suis maintenant de ne pas avoir d'erreur, cependant read() retourne 0
Êtes-vous sûr? J'ai essayé ce code et read() renvoie 3, comme il doit l'être.
Encore une erreur est affiché
OriginalL'auteur mikithskegg
Qu'advient-il si vous venez d'effectuer une lecture/écriture? Je ne suis pas sûr que le dup et le chat sont ce que vous voulez ici, pour être honnête:
Et, en pensant de plus, si vous connaissez le fd vous souhaitez mettre fin à, l'utilisation dup2, pas de dup. Connaître votre Api, les gens!
Et, de la pensée encore plus loin, vous pouvez consulter la source de l'popen(3), ce qui est exactement ce que, d'une manière plus générale.
Par socketpair() permet la communication bidirectionnelle.
popen n' exactement cela, il vous suffit de l'étendre à deux tuyaux, pas un
OriginalL'auteur tbert